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
相关产品推荐
相关产品推荐

