首页 > 解决方案 > 解析传入的短信 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. 我找不到一些关于如何使用接收器的例子。我需要了解如何将接收器与某些活动联系起来。如果有任何帮助,我将不胜感激。

标签: javaandroidkotlin

解决方案


你可以像下面这样,在你的 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()
}

推荐阅读