Я работаю над приложением, которое преобразует полученный контент 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("","")
}
}