Firebase发送短信OTP验证码报错17020等问题如何解决?
问题根因
你遇到的核心报错是java.net.UnknownHostException: Unable to resolve host "www.googleapis.com",是设备无法连通谷歌服务接口导致的连锁错误:无法获取SafetyNet Token、无法生成reCAPTCHA验证凭证,最终触发短信验证请求错误码17020。
修复步骤
1. 网络与基础权限检查
- 确认测试设备/模拟器的网络可以正常访问谷歌服务,国内测试需要使用可连通谷歌接口的网络环境
- 检查
AndroidManifest.xml中是否添加了必要权限:<!-- 必加网络权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. 修正OTP请求超时配置
你当前在SendOTPCode.java中设置的验证超时时间仅为1秒,完全不足以完成 SafetyNet 验证、接口请求的全链路流程,修改超时时间为官方推荐的60秒:// 原错误配置 //.setTimeout(1L, TimeUnit.SECONDS) // 修正后配置 .setTimeout(60L, TimeUnit.SECONDS)3. 校验Firebase配置一致性
- 确认
google-services.json中的包名与你项目build.gradle里的applicationId "com.example.firebase.sms.smsotp4"完全一致 - 确认Firebase控制台安卓应用配置页面,添加的SHA-1、SHA-256签名和你当前运行打包的签名完全匹配:调试模式需要添加debug keystore的签名,正式发布需要添加正式签名文件的对应签名
- 确认
4. 修正异步逻辑错误
SendOTPCode.send()方法中的PhoneAuthProvider.verifyPhoneNumber是异步请求,你在请求发起后立刻返回静态变量sended的逻辑是错误的,此时请求还未完成,sended永远为初始默认值,建议直接删除同步返回判断逻辑,完全依赖verificationId的LiveData回调处理后续跳转即可。5. 临时测试方案
如果仅需要功能测试,可以在Firebase控制台手机认证页面开启不安全测试模式,添加测试手机号和固定验证码,不需要走真实短信发送和SafetyNet校验流程,可快速验证业务逻辑。
内容的提问来源于stack exchange,提问作者Youssef Amr
相关产品推荐
相关产品推荐

