Google Play上架遇SmsBroadcastReceiver意图重定向错误求助
解决Google Play上架时SmsBroadcastReceiver的意图重定向错误
问题根源分析
你的代码与Manifest配置存在两处关键不匹配,再加上缺少意图来源验证,触发了Google Play的安全检测警告:
- Manifest中广播接收器的
intent-filter监听android.provider.Telephony.SMS_RECEIVED,但代码实际处理的是SmsRetriever.SMS_RETRIEVED_ACTION,两者完全不对应。 - 错误添加了
android.permission.BROADCAST_SMS权限,该权限用于接收原始短信广播,和SmsRetriever服务无关。 - 处理
SmsRetriever.EXTRA_CONSENT_INTENT时未验证来源,存在被恶意应用劫持的风险。
修复步骤
1. 修正Manifest广播配置
将广播接收器的intent-filter和权限调整为SmsRetriever服务要求的配置:
<receiver android:name=".broadcast.SmsBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED_ACTION" /> </intent-filter> </receiver>
- 移除
android.permission.BROADCAST_SMS:SmsRetriever通过Google Play Services传递广播,无需该权限。 - 保持
android:exported="false":确保广播仅应用内部可接收,避免外部应用触发。
2. 为Consent Intent添加来源验证
在onSuccess方法中,验证messageIntent的来源合法性,防止意图被重定向:
fun onSuccess(intent: Intent?) { intent?.let { // 验证Intent的包名是否为Google Play Services的官方包名 val packageName = it.component?.packageName if ("com.google.android.gms" == packageName) { // 安全启动Consent Intent try { startIntentSenderForResult(it.intentSender, REQ_CODE_SMS_CONSENT, null, 0, 0, 0) } catch (e: IntentSender.SendIntentException) { e.printStackTrace() // 处理启动失败逻辑 } } else { // 来源非法,拒绝处理并触发失败回调 onFailure() } } ?: onFailure() }
- 通过检查Intent的组件包名,确保它来自官方Google Play Services,避免恶意构造的Intent被处理。
3. 补充代码空安全处理
在onReceive中对可空参数做安全校验,避免空指针异常:
override fun onReceive(context: Context?, intent: Intent?) { if (intent?.action != SmsRetriever.SMS_RETRIEVED_ACTION) return val extras = intent.extras ?: return val smsRetrieverStatus = extras.get(SmsRetriever.EXTRA_STATUS) as? Status ?: return when (smsRetrieverStatus.statusCode) { CommonStatusCodes.SUCCESS -> { val messageIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT) smsBroadcastReceiverListener?.onSuccess(messageIntent) } CommonStatusCodes.TIMEOUT -> { smsBroadcastReceiverListener?.onFailure() } } }
验证修复
完成上述修改后,重新生成签名APK/AAB提交Google Play审核,即可消除意图重定向错误。
内容的提问来源于stack exchange,提问作者Berkay
相关产品推荐
相关产品推荐

