繁体   English   中英

解析传入的SMS Android(API 26)

[英]Parse incoming SMS 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)

}

在清单文件中写下以下内容

Manifest.xml

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

在您的课程上

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM