You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Play上架遇SmsBroadcastReceiver意图重定向错误求助

解决Google Play上架时SmsBroadcastReceiver的意图重定向错误

问题根源分析

你的代码与Manifest配置存在两处关键不匹配,再加上缺少意图来源验证,触发了Google Play的安全检测警告:

  1. Manifest中广播接收器的intent-filter监听android.provider.Telephony.SMS_RECEIVED,但代码实际处理的是SmsRetriever.SMS_RETRIEVED_ACTION,两者完全不对应。
  2. 错误添加了android.permission.BROADCAST_SMS权限,该权限用于接收原始短信广播,和SmsRetriever服务无关。
  3. 处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:17:46