使用SMS Retriever API无法获取短信内容(模拟器测试求助)
解决SMS Retriever API无法获取验证码的问题
看起来你已经把基础配置都搭好了,但还是收不到短信内容,我帮你梳理几个最可能的问题点,一步步排查:
1. 测试短信格式不符合API要求
这是最容易踩的坑!SMS Retriever API对短信格式有严格要求,必须同时满足两个条件:
- 短信必须以
<#>开头 - 结尾必须包含你的应用专属的哈希签名
你的测试短信只有<#> Your verify code is: 12345,缺少了应用哈希,API根本不会识别这条短信并推送给你的App。
你可以用这段代码生成应用哈希:
import android.content.Context; import android.content.pm.PackageManager; import android.util.Base64; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class AppSignatureHelper { private static final String HASH_TYPE = "SHA-256"; public static final int NUM_HASHED_BYTES = 9; public static final int NUM_BASE64_CHAR = 11; public static String getAppSignature(Context context) { try { String packageName = context.getPackageName(); PackageManager packageManager = context.getPackageManager(); byte[] signature = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0].toByteArray(); MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE); messageDigest.update(signature); byte[] hashBytes = messageDigest.digest(); hashBytes = java.util.Arrays.copyOfRange(hashBytes, 0, NUM_HASHED_BYTES); String base64Hash = Base64.encodeToString(hashBytes, Base64.NO_PADDING | Base64.NO_WRAP); return base64Hash; } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } }
调用AppSignatureHelper.getAppSignature(context)拿到哈希后,把它加到短信末尾,比如:
<#> Your verify code is: 12345 FA+9qCX9VSu
这样API才会识别这条短信并推送给你的应用。
2. 广播注册的冲突问题
你同时在Manifest静态注册了SmsReceiver,又在代码里动态注册了同一个Receiver实例,这可能导致接收逻辑混乱。建议只保留一种注册方式:
- 如果用静态注册:确保Manifest配置正确,删掉MainActivity里的动态注册代码
- 如果用动态注册:去掉Manifest里的Receiver注册,并且记得在Activity销毁时注销Receiver(避免内存泄漏)
比如保留静态注册的话,把MainActivity里这段代码删掉:
SmsReceiver smsReceiver = new SmsReceiver(); IntentFilter filter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION); ApplicationLoader.applicationContext.registerReceiver(smsReceiver, filter);
3. 模拟器的Google Play Services状态
SMS Retriever API依赖Google Play Services,有些第三方模拟器可能没有正确安装或更新Google Play Services,导致API无法正常工作。建议:
- 使用Google官方的Android模拟器(选择带Google Play的系统镜像)
- 检查模拟器里的Google Play Services是否为最新版本
4. 最后验证步骤
- 生成正确的应用哈希,修改测试短信内容加上哈希
- 清理广播注册冲突,只保留一种注册方式
- 重启模拟器,确保Google Play Services正常运行
- 重新启动App,调用
startSmsRetriever()后发送符合格式的短信,查看Logcat里是否打印出短信内容
内容的提问来源于stack exchange,提问作者Programmer2002
相关产品推荐
相关产品推荐

