Ошибка перенаправления намерения SmsBroadcastReceiver

Когда я пытаюсь опубликовать свое приложение в магазине Play, но получаю ошибку перенаправления намерения в своем приемнике вещания. Вот соответствующий код.


class SmsBroadcastReceiver : BroadcastReceiver() {

    var smsBroadcastReceiverListener: SmsBroadcastReceiverListener? = null

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

        if (intent?.action == SmsRetriever.SMS_RETRIEVED_ACTION) {

            val extras = intent.extras
            val smsRetrieverStatus = extras?.get(SmsRetriever.EXTRA_STATUS) as Status

            when (smsRetrieverStatus.statusCode) {
                CommonStatusCodes.SUCCESS -> {

                    val messageIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
                    smsBroadcastReceiverListener?.onSuccess(messageIntent)
                }
                CommonStatusCodes.TIMEOUT -> {
                    smsBroadcastReceiverListener?.onFailure()
                }
            }
        }
    }

    /**
     * Sms Broadcast Receiver Listener
     */
    interface SmsBroadcastReceiverListener {
        /**
         * if common status success
         */
        fun onSuccess(intent: Intent?)
        /**
         * if common status timeout
         */
        fun onFailure()
    }
}

А вот мой файл манифеста для моей трансляции

        <receiver
            android:name = ".broadcast.SmsBroadcastReceiver"
            android:exported = "false"
            android:permission = "android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name = "android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

Я не нашел решения, может кто-нибудь помочь?

Пытался изменить файл манифеста, но мне кажется, что все в порядке. Вероятно, проблема связана с моей функцией onReceive, но я не смог найти решения.

1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пробовали ли вы это решение от Prasenjit?

Я тоже столкнулся с точной проблемой и собираюсь попробовать это решение. извините, мне пришлось ответить, а не просто прокомментировать. Моя репутация ниже 50, я не могу напрямую комментировать ваш вопрос.

Если быть более точным в моей проблеме, она указала мне на мой onSuccess. Ваш код точно такой же, как и мой.

    private val smsBroadcastReceiver by lazy {
    SmsBroadcastReceiver().also {
        it.smsBroadcastReceiverListener =
            object : SmsBroadcastReceiver.SmsBroadcastReceiverListener {
                override fun onSuccess(intent: Intent?) {
                    intent?.let { context ->
                        smsBroadcastReceiverLauncher.launch(context)
                    }
                }

                override fun onFailure() {}
            }
    }
}

прямо здесь, когда я собираюсь запустить smsBroadCastRecieverLauncher. Я спросил, пробовали ли вы уже из Парсенджита, так как здесь есть смысл сказано img в googleSupp.

Если вы уже решили проблему, вы можете спросить, что вы сделали?

Я уже решил проблему и опубликовал для вас ответ. Вы можете увидеть его ниже.

Berkay 10.06.2024 09:41
Ответ принят как подходящий
class SmsBroadcastReceiver : BroadcastReceiver() {

var smsBroadcastReceiverListener: SmsBroadcastReceiverListener? = null

override fun onReceive(context: Context?, intent: Intent?) {
    // Verify the intent action
    if (intent?.action == SmsRetriever.SMS_RETRIEVED_ACTION) {
        val extras: Bundle? = intent.extras
        val smsRetrieverStatus = extras?.get(SmsRetriever.EXTRA_STATUS) as? Status

        // Validate the status is from the expected sender
        if (smsRetrieverStatus != null) {
            when (smsRetrieverStatus.statusCode) {
                CommonStatusCodes.SUCCESS -> {
                    val messageIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)

                    // Validate the nested intent
                    if (validateIntent(context, messageIntent)) {
                        smsBroadcastReceiverListener?.onSuccess(messageIntent)
                    } else {
                        Log.w("SmsBroadcastReceiver", "Untrusted intent detected")
                    }
                }
                CommonStatusCodes.TIMEOUT -> {
                    smsBroadcastReceiverListener?.onFailure()
                }
                else -> {
                    Log.w("SmsBroadcastReceiver", "Unexpected status code: ${smsRetrieverStatus.statusCode}")
                }
            }
        } else {
            Log.w("SmsBroadcastReceiver", "SmsRetriever status is null")
        }
    } else {
        Log.w("SmsBroadcastReceiver", "Unexpected intent action: ${intent?.action}")
    }
}

// Validate the nested intent
private fun validateIntent(context: Context?, intent: Intent?): Boolean {
    if (context == null || intent == null) return false

    // Check if the nested intent grants URI permissions
    val flags = intent.flags
    if ((flags and Intent.FLAG_GRANT_READ_URI_PERMISSION != 0) ||
        (flags and Intent.FLAG_GRANT_WRITE_URI_PERMISSION != 0)) {
        return false
    }

    // Ensure the nested intent is not harmful
    val componentName = intent.resolveActivity(context.packageManager)
    Log.d("SmsBroadcastReceiver", "Resolved ComponentName: $componentName")

    // Check if the intent comes from a trusted package
    val isValid = componentName?.packageName == "com.google.android.gms"
    Log.d("SmsBroadcastReceiver", "isValid: $isValid")

    return isValid
}

/**
 * Sms Broadcast Receiver Listener
 */
interface SmsBroadcastReceiverListener {
    /**
     * if common status success
     */
    fun onSuccess(intent: Intent?)

    /**
     * if common status timeout
     */
    fun onFailure()
} }

Другие вопросы по теме