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

使用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. 最后验证步骤

  1. 生成正确的应用哈希,修改测试短信内容加上哈希
  2. 清理广播注册冲突,只保留一种注册方式
  3. 重启模拟器,确保Google Play Services正常运行
  4. 重新启动App,调用startSmsRetriever()后发送符合格式的短信,查看Logcat里是否打印出短信内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:22:27