Разбор входящих SMS Android (API 26) - PullRequest
0 голосов
/ 02 декабря 2018

Мне нужно проанализировать входящее сообщение в приложение, но я не понимаю, как это сделать.Это мой приемник:

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 голосов
/ 02 декабря 2018

Вы можете сделать, как показано ниже, в вашем 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)
                {
                }
            }
        }
    }
}

======

Parser как ниже

======

    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>

В вашем классе 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 () отмените регистрацию вещательного приемника

    override fun onStop() {//
    super.onStop()
    try {
        unregisterReceiver(smsReceiver)
    } catch (e: Exception) {

    }
    disableBroadcastReceiver()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...