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

Sms Retriever API失效:自动捕获OTP的广播接收器未触发

解决SMS Retriever API广播接收器不触发的问题

以下是排查和解决的核心要点:

1. 验证应用哈希字符串的正确性

这是最容易出错的环节,必须确保短信末尾的哈希是当前应用签名对应的哈希:

  • 调试和发布签名生成的哈希完全不同,不能直接用示例哈希。
  • 使用keytool命令生成对应签名的哈希(替换占位符为你的信息):
    keytool -exportcert -alias YOUR_KEY_ALIAS -keystore YOUR_KEYSTORE_PATH | xxd -p | tr -d "[:space:]" | echo -n YOUR_PACKAGE_NAME `cat -` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
    
  • 生成的哈希要和短信末尾的完全一致,包括大小写。

2. 检查广播接收器的注册配置

  • 确认接收器的类路径正确:.receiver.AutoReadSMSReceiver必须对应实际的包结构,比如接收器在com.your.app.receiver下,需写全路径com.your.app.receiver.AutoReadSMSReceiver。
  • 确保android:exported="true"已设置,系统广播需要接收器对外暴露。
  • 核对intent-filter的action拼写:com.google.android.gms.auth.api.phone.SMS_RETRIEVED,大小写和符号不能错。

3. 规范SMS Retriever的启动逻辑

  • 正确初始化并启动Retriever,建议在用户点击「获取验证码」按钮后执行,避免提前启动导致超时:
    val smsRetrieverClient = SmsRetriever.getClient(requireContext())
    val startTask = smsRetrieverClient.startSmsRetriever()
    startTask.addOnSuccessListener {
        // 启动成功,等待短信触发
    }.addOnFailureListener {
        // 启动失败,检查Google Play服务状态
    }
    
  • 注意API的超时时间是5分钟,超过时间后需要重新启动。

4. 严格遵循短信格式要求

短信必须完全符合API规定的格式:

  • 开头必须是[#],不能有任何前缀字符。
  • 内容和哈希之间可以换行,但哈希必须是短信的最后一行,且无多余字符。示例正确格式:

    [#]你的验证码:678901
    XyZ12AbC3dF

5. 检查Google Play服务版本

  • 设备上的Google Play服务版本需≥10.2.0,低于此版本不支持SMS Retriever API。
  • 可在代码中检查并提示用户更新:
    val playServicesStatus = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(requireContext())
    if (playServicesStatus != ConnectionResult.SUCCESS) {
        GoogleApiAvailability.getInstance().getErrorDialog(requireActivity(), playServicesStatus, 1001).show()
    }
    

6. 排除其他系统限制

  • 确保应用未被系统禁用通知权限(部分设备可能影响广播接收)。
  • Android 12及以上版本,静态注册的广播接收器依然有效,但需确认没有应用级别的权限限制。

内容的提问来源于stack exchange,提问作者Kanchan Pal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:05:32