Flutter应用Web端Google Sign-In正常,Android端登录失败报ApiException 10错误
Android端Google Sign-In报
ApiException: 10的解决方案 该错误本质是开发者身份校验未通过,Web端登录正常是因为Web端完全不依赖Android应用的签名校验链路,和Android端的校验逻辑相互独立。你已经配置SHA1、替换了google-services.json但依然报错,说明还有配置链路的遗漏点,按以下步骤逐一排查即可:
基础配置一致性校验
- 首先核对
google-services.json中记录的应用包名,必须和Android工程android/app/build.gradle内的applicationId完全一致,不能存在大小写差异、渠道后缀差异——比如后台配置的是com.xxx.myapp,但工程里实际写的是com.xxx.myapp.dev,就会直接触发10号错误。 - 核对提交的SHA1密钥类型:如果你是在debug调试模式下运行应用,必须把本地debug签名的SHA1值上传到后台,不能只上传了正式发布包的SHA1。获取debug签名SHA1的命令为:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
注意不同开发环境下的debug.keystore路径不同,不要跨设备复用SHA1值。 - 如果使用了Flutter的多渠道构建(Flavor),每个渠道对应的独立applicationId、对应签名的SHA1,都要单独在Google后台配置对应条目,不能只配默认主渠道的信息。
工程配置遗漏排查
- 确认
android/app/build.gradle文件的插件部分已经引入Google服务插件,缺失该配置会导致google-services.json的内容根本不会被编译进应用,等于配置完全无效,需要加上:apply plugin: 'com.google.gms.google-services' - 检查项目根目录下
android/build.gradle的仓库配置,必须加入Google官方Maven仓库地址,否则google_sign_in依赖的Google Play服务组件会拉取异常。 - 检查
AndroidManifest.xml中是否有自定义的scheme、host配置,存在和Google登录回调地址冲突的拦截规则时,会直接导致登录流程中断。
代码实现的常见坑
- 不要在按钮点击的回调里临时初始化Firebase、临时实例化
GoogleSignIn对象,正确的做法是把Firebase.initializeApp()放到应用启动的main函数中提前执行,GoogleSignIn实例做成全局单例,频繁重建登录实例会导致身份校验上下文丢失。 - 给所有登录相关的await操作加上try-catch异常捕获,你当前的代码没有做异常拦截,一旦登录过程中出现用户取消、校验失败的情况,就会抛出未处理的PlatformException,看不到更细节的报错定位信息。
- 不要在初始化GoogleSignIn的时候手动添加额外的请求权限(Scopes),默认的基础登录权限就足够获取idToken和accessToken,未在后台配置的额外权限会触发校验拒绝。
生效验证
- 所有配置修改完成后,不要直接热重载/热重启运行,先执行
flutter clean清理build目录下的旧配置缓存,再重新构建安装应用到测试设备。 - 测试前确认设备上已经登录了有效Google账号,且设备的Google Play服务为最新版本,没有被系统禁用。
内容的提问来源于stack exchange,提问作者Bill_The_Coder
相关产品推荐
相关产品推荐

