解析传入的SMS Android(API 26)

时间:2018-12-02 14:47:36

标签: java android kotlin

我需要解析到应用程序的传入消息,但是我不知道该怎么做。这是我的接收者:

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。我找不到一些有关如何使用接收器的示例。我需要了解如何使接收者参与一些活动。我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以按照以下方式进行操作, 在您的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)

}

在清单文件中写以下内容

Manifest.xml

        <receiver android:name=".common.SmsReceiver">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
    </receiver>

在您的班级上,on简历

 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()
}