java - 解析传入的短信 Android (API 26)
问题描述
我需要将传入的消息解析到应用程序,但我不明白该怎么做。这是我的接收器:
class SmsReceiver: BroadcastReceiver() {
companion object {
val ACTION = "android.provider.Telephony.SMS_RECEIVED"
val BANKMANE = ""
val SMS_BODY = "sms_body"
val PDUS = "pdus"
}
override fun onReceive(context: Context, intent: Intent) {
if (intent.action != null &&
ACTION.compareTo(intent.action, false) === 0) {
val pduArray = intent.extras.get(PDUS) as Array<Any>
val messages = arrayOfNulls<SmsMessage>(pduArray.size)
for (i in pduArray.indices) {
messages[i] = SmsMessage.createFromPdu(pduArray[i] as ByteArray)
}
val sms_from = messages[0]!!.getDisplayOriginatingAddress()
if (sms_from.equals(BANKMANE, ignoreCase = true)) {
val bodyText = StringBuilder()
for (i in 0 until messages.size) {
bodyText.append(messages[i]!!.getMessageBody())
}
val body = bodyText.toString()
val mIntent = Intent(context, SmsService::class.java)
mIntent.putExtra(SMS_BODY, body)
context.startService(mIntent)
abortBroadcast()
}
}
}}
这是我的Manifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
...........
<receiver android:name=".smsParcer.SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
</application>
我真的不明白如何使用这个接收器,以及如何正确地制作Mainfest.xml
. 我找不到一些关于如何使用接收器的例子。我需要了解如何将接收器与某些活动联系起来。如果有任何帮助,我将不胜感激。
解决方案
你可以像下面这样,在你的 onReceive 中,
override fun onReceive(context: Context, intent: Intent) {
val data = intent.extras
if (data!!.get("pdus") != null) {
val pdus = data!!.get("pdus") as Array<Any>
for (i in pdus.indices) {
val smsMessage = SmsMessage.createFromPdu(pdus[i] as ByteArray)
val sender = smsMessage.displayOriginatingAddress
val messageBody = smsMessage.messageBody
if (messageBody.toLowerCase().contains("please use the verification code", ignoreCase = true)) {
try {
mListener!!.messageReceived(parseCode(messageBody))
}catch (e:NullPointerException)
{
}
}
}
}
}
======
解析器如下
======
private fun parseCode(msg: String): String {
var upToNCharacters: String? = null
try {
var message = msg
var part = arrayOf<String>()
try {
part = message.split("(?<=\\D)(?=\\d)".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
} catch (e: Exception) {
e.printStackTrace()
}
message = message.replace("FLAG", "")
upToNCharacters = part[1].substring(0, Math.min(part[1].length, 6))
Log.i("---->", upToNCharacters)
} catch (e: Exception) {
}
return upToNCharacters!!
}
=====
您的界面如下所示
interface SmsListener {
fun messageReceived(messageText: String)
}
在您的清单文件中写下
清单.xml
<receiver android:name=".common.SmsReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
在你的课堂上 onResume
val receiver = ComponentName(this, SmsReceiver::class.java!!) //created SMSLog class above!
val pm = this.packageManager
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP)
try {
this.registerReceiver(smsReceiver, android.content.IntentFilter("android.provider.Telephony.SMS_RECEIVED"))
} catch (e: Exception) {
}
并在您的 onStop() 中取消注册您的 broadcastReceiver
override fun onStop() {//
super.onStop()
try {
unregisterReceiver(smsReceiver)
} catch (e: Exception) {
}
disableBroadcastReceiver()
}
推荐阅读
- ios - 照片选择器错误 - 使用时与插件的连接中断
- javascript - 在 html 中使用单选按钮添加价格
- javascript - 为什么我需要两次点击两次才能触发onclick事件 - tictactoe
- c# - Xamarin.Forms:在 C# 中绑定到整个 BindingConext(不是 XAML)
- javascript - 如何使下拉菜单恰好出现在 Material-UI 中的栏下方?
- api - 空手道:是否可以从场景大纲中匹配 json
- python - 如何清理 matplotlib 中的 x 轴值?
- python - 如何将列中的所有值从数千转换为数十亿?使用熊猫
- docker - 无法连接到远程 docker 守护进程
- node.js - Stripe - 如何创建延迟订阅