Firebase手机认证自动登录失败(超时)问题求助
解决Firebase Auth手机号自动登录(短信自动检索)超时问题
你遇到的SmsRetrieverHelper Timed out waiting for SMS错误,通常是因为短信格式不符合要求、缺少SmsRetriever监听配置,或者应用哈希配置错误导致的。下面一步步帮你排查解决:
1. 确保短信包含应用的哈希字符串(核心要求)
Firebase的SmsRetriever API只能识别包含应用专属哈希字符串的短信,这是自动检索的必要条件。短信格式必须类似:
Your verification code is 123456
FA+9qCX9VSu
- 第二行的
FA+9qCX9VSu就是你的应用哈希,必须准确无误地出现在短信末尾(可以单独一行,也可以跟在验证码后面,但必须完整)。 - 如果你的短信模板没有包含这个哈希,SmsRetriever根本无法识别这条短信,自然会触发超时。
2. 正确生成并配置应用哈希
应用哈希和你的签名文件(debug/release)绑定,不同签名生成的哈希不同,必须对应添加到Firebase控制台:
生成debug签名哈希(开发环境)
打开终端执行以下命令(替换为你的包名):
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | xxd -p | tr -d "[:space:]" | echo -n com.your.app.package `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
- 默认debug keystore密码是
android,如果你的自定义了签名,替换对应的alias和keystore路径。
配置到Firebase控制台
- 打开Firebase控制台,进入你的项目
- 导航到Authentication > 登录方法 > 电话
- 在Android应用哈希区域,添加你生成的哈希字符串
3. 添加SmsRetriever监听代码
你的现有代码只调用了PhoneAuthProvider.verifyPhoneNumber,但缺少SmsRetriever的监听启动。需要在发送验证码之前,初始化并启动SmsRetrieverClient:
修改你的verificationPassed()方法,在构建PhoneAuthOptions之前添加以下代码:
// 初始化SmsRetriever客户端 SmsRetrieverClient smsRetrieverClient = SmsRetriever.getClient(AuthActivity.this); // 启动短信检索监听 Task<Void> retrieverTask = smsRetrieverClient.startSmsRetriever(); retrieverTask.addOnSuccessListener(aVoid -> { // 监听启动成功,现在可以发送验证码了 Log.d(TAG, "SmsRetriever监听已启动"); }); retrieverTask.addOnFailureListener(e -> { Log.w(TAG, "SmsRetriever监听启动失败: " + e.getMessage()); FancyToast.makeText(AuthActivity.this, "自动验证功能无法启用,请手动输入验证码", FancyToast.LENGTH_SHORT, FancyToast.WARNING, false).show(); });
4. 检查其他潜在问题
- 签名一致性:确保你测试用的APK签名和生成哈希时用的签名一致(debug包用debug签名,release包用release签名),否则哈希不匹配,SmsRetriever无法识别。
- 网络权限:确保
AndroidManifest.xml中添加了<uses-permission android:name="android.permission.INTERNET" />,Firebase需要网络通信来验证哈希和短信。 - Android版本兼容:SmsRetriever API支持Android 6.0(API 23)及以上版本,如果你的测试设备低于这个版本,自动检索功能本身就不支持,会触发超时。
验证修改
完成上述配置后,重新发送验证码:
- 检查收到的短信是否包含正确的应用哈希
- 查看日志是否还有超时错误
- 如果一切正常,
onVerificationCompleted方法会被自动触发,填充OTP并完成自动登录
内容的提问来源于stack exchange,提问作者4xMafole




