Kotlin - API 27 и выше - получатель SMS-трансляции - PullRequest
0 голосов
/ 07 января 2019

Я работаю над приложением, которое преобразует полученный контент SMS в несколько строк и отправляет их в базу данных на моем сервере. У меня настроен приемник Broadcast, и он отлично работает на всех устройствах с API26 и ниже. Для более высоких версий мне нужно вручную отключить и включить разрешения в настройках приложения на несколько минут, чтобы оно больше не реагировало на новые SMS.

Я не хочу регистрировать мой получатель в действии, потому что он должен реагировать на все полученные SMS, даже если приложение не запущено ... И это прекрасно работает с неявным получателем ...

Кто-нибудь знает, что я делаю неправильно, или что было бы правильным обходным путем?

Спасибо!

Манифест декларации:

<receiver
        android:name=".WakeupReceiver"
        android:enabled="true"
        android:exported="true"
        android:permission="android.permission.BROADCAST_SMS"

        android:stopWithTask="false">
        <intent-filter android:priority="2147483643">
            <category android:name="android.intent.category.DEFAULT" />

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

Объявление класса:

class WakeupReceiver : BroadcastReceiver() {


override fun onReceive(context: Context, intent: Intent) {

        val (smsContact, smsBody) = getSMSContent(intent)
        if (smsContact=="Utils.myNumber") {
           Log.d("Log","SMS received!")
        }

    }



private fun getSMSContent(intent: Intent): Pair<String, String> {
    val data = intent.extras
    val pdusObj = data!!.get("pdus") as Array<*>
    for (i in pdusObj.indices) {
        val currentMessage = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
            Telephony.Sms.Intents.getMessagesFromIntent(intent)[0]
        else SmsMessage.createFromPdu(pdusObj[0] as ByteArray)

        // TODO: Here we get the all information about SMS.
        //Apply your conditions and logic here to filter your SMS from various SMS
        // and extract your content from message body

        val phoneNumber = currentMessage.displayOriginatingAddress
        Log.e("phoneNumber", phoneNumber)

        val senderNum = phoneNumber
        Log.e("senderNum", senderNum)

        val smsContent = currentMessage.displayMessageBody

        return Pair(senderNum, smsContent)
    }
    return Pair("","")
}

}

...