Когда я пытаюсь опубликовать свое приложение в магазине 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, но я не смог найти решения.
Пробовали ли вы это решение от 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.
Если вы уже решили проблему, вы можете спросить, что вы сделали?
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()
} }
Я уже решил проблему и опубликовал для вас ответ. Вы можете увидеть его ниже.