PlatformException (PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException:

Posted

技术标签:

【中文标题】PlatformException (PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 12500: , null))【英文标题】: 【发布时间】:2019-10-04 21:35:32 【问题描述】:

要崩溃的行:

GoogleSignInAccount googleUser = await _googleSignIn.signIn();

我尝试了什么:

    我已经用这个命令生成了我的 SH1 密钥keytool -list -v \ -alias androiddebugkey -keystore ~/.android/debug.keystore 将 SH1 加密添加到 console.firebase.google.com 重新下载 google-service.json 将debug.keystore.android 复制到MyProject/android 在调试和发布中运行

    添加到android/build.gradle 这些行:

    类路径'com.android.tools.build:gradle:3.2.1' 类路径 'com.google.gms:google-services:4.2.0'

    添加到android/app/build.gradle这行:

    依赖项下实现'com.google.firebase:firebase-core:16.0.9' 在文件末尾应用插件:'com.google.gms.google-services'。 在我的项目文件夹下创建一个名为release-signing.properties 的文件,其中包含这些行。 storeFile=debug.keystore keyAlias=androiddebugkey storePassword=android keyPassword=android

另外,我搜索了 ALL *** 问题,我可以找到这个问题,但没有一个对我有用。

我的 pubspec.yaml:

firebase_core: ^0.4.0+1
firebase_analytics: ^3.0.1

cloud_firestore: ^0.11.0+2

firebase_auth: ^0.11.1
google_sign_in: ^4.0.1+3

rxdart: ^0.22.0

授权类:

class AuthService 
  final GoogleSignIn _googleSignIn = GoogleSignIn();
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final Firestore _db = Firestore.instance;

  Observable<FirebaseUser> user;
  Observable<Map<String, dynamic>> profile;
  PublishSubject loading = PublishSubject();

  AuthService() 
    user = Observable(_auth.onAuthStateChanged);
    profile = user.switchMap((FirebaseUser user) 
      if (user != null) 
        return _db
            .collection('user')
            .document(user.uid)
            .snapshots()
            .map((snap) => snap.data);
       else 
        return Observable.just();
      
    );
  

  Future<FirebaseUser> googleSignIn() async 
    loading.add(true);
    GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    GoogleSignInAuthentication googleAuth = await googleUser.authentication;
    // FirebaseUser user = await _auth.signInWithGoogle(
        // accessToken: googleAuth.accessToken, idToken: googleAuth.idToken);
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    FirebaseUser user = await _auth.signInWithCredential(credential);
    updateUserData(user);
    print("Sign in" + user.displayName);

    loading.add(false);

    return user;
  

主类:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget 
  // This widget is the root of your application.
  AuthService authService = AuthService();

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blueGrey,
      ),
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              MaterialButton(
                child: Text("Log in with Google"),
                color: Colors.blueGrey,
                textColor: Colors.deepOrange,
                onPressed: () => authService.googleSignIn(),
              ),
              MaterialButton(
                child: Text("LogOut"),
                color: Colors.redAccent,
                textColor: Colors.purple,
                onPressed: () => authService.signOut(),
              ),
            ],
          ),
        ),
      ),
    );
  

如果你们中的任何人能指出我正确的方向,我将不胜感激。

这里有一些我已经尝试过的 *** 链接:

    Google sign in doesn't work after release of flutter app Flutter and google_sign_in plugin: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null) Google Sign In error 12500

我没有运气,请让我知道您的想法以及我该如何解决。

【问题讨论】:

你究竟是什么时候遇到这个错误的? 按下“使用 Google 登录”按钮后,我将打开一个弹出窗口,我需要在其中选择我的 google 帐户。在我按下我的 Google 帐户后,我会立即收到此错误消息。 我已经在问题中添加了将崩溃的行。 您是否检查了 logcat 以获得更详细的错误消息?由于是平台异常,所以在平台端失败了,所以有时你会在 android 或 ios 日志中发现你在 Flutter 中找不到的错误消息 【参考方案1】:

在我的情况下,问题是由于模拟器不兼容。模拟器没有 Playstore。

我创建了一个包含 playstore 的新 AVD。然后就成功了!

Reference to create new emulator with Playstore

另外,请确认您已在 Firebase 控制台上添加了 SHA1 密钥。

【讨论】:

【参考方案2】:

只是为了添加到这个已经很庞大的想法列表中。在尝试了此处列出的所有方法后,我仍然收到错误消息。

我必须在 OAuth 同意屏幕下将自己添加为测试用户。

【讨论】:

【参考方案3】:

将您的模拟器更改为另一个如何支持 google play 商店

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案4】:

我遇到了同样的问题,我通过使用 Keytool 添加调试/发布 SHA1 和 SHA256 证书指纹来解决它

发布

keytool -exportcert -list -v -alias <your-key-name> -keystore <path-to-production-keystore>

调试

keytool -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore

更多详情:https://developers.google.com/android/guides/client-auth

【讨论】:

【参考方案5】:

当我更改为 android studio 时,使用 Visual Studio 时遇到了同样的问题。我想是因为我使用 android studio 登录了 firebase

【讨论】:

【参考方案6】:

就我而言,我没有启用 Google 登录方法。

【讨论】:

【参考方案7】:

转到您的 google 帐户的 API & Servcies 页面,并确保在左上角选择您感兴趣的项目,如下所示

确保您在上面输入了支持电子邮件 ID

并且以下所有字段都必须有值

现在尝试登录,它会工作!

【讨论】:

【参考方案8】:

您需要完成“Oauth 同意屏幕

我去了这个页面 (https://console.developers.google.com/apis/credentials) 不要忘记在列表中选择您的项目(左上角)。然后进入“Oauth 同意屏幕”

我填写了应用程序徽标和应用程序主页链接和应用程序隐私政策链接(带有 project.firebaseapp.com)并保存。

现在可以了,我可以登录了。

这必须在文档中解释。人们会发疯的,不要因为这种缺乏文档而颤抖。

【讨论】:

我按照您的建议添加了一个徽标,效果非常好。有点可笑,但至少现在已经整理好了! 哦,主啊!这是一个救生员。我对 SHA 1 和 google-services.json 感到头疼【参考方案9】:

OP @Mircea 特别提到了错误 12500。这就是我克服该错误的方法:

过去几天我遇到了同样的问题。我对代码进行了数十次重构,添加了断点,重置了 SHA-1、SHA-256,并做了我能找到的几乎所有其他基于“代码”的解决方案。我经常遇到错误:

E/flutter (11935): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 12500: , null)

我正在失去理智,所以我决定从新的角度开始,然后再慢慢地解决问题。我注意到一个隐藏在一个线程深处的不起眼的帖子,其中提到了有关拥有支持电子邮件的内容。直到我添加了上述支持电子邮件,事情才“神奇地”开始起作用。我在下面附上了我项目的 Firebase 设置的屏幕截图。

【讨论】:

它不适合我 是的,对于 12500 错误代码,这是有效的...谢谢。【参考方案10】:

按照文档中提到的所有步骤进行操作后,即使我也遇到了同样的问题。对我有用的一件事是在 firebase 控制台的设置页面中添加支持电子邮件

【讨论】:

【参考方案11】:

我遇到了同样的问题,解决这个问题的方法是在 SHA-1 中添加一个 SHA-256 指纹

这里提到 -> Flutter and google_sign_in plugin: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)

希望这对你也有用!

【讨论】:

【参考方案12】:

我也尝试了几乎所有可以从互联网上搜索的答案。所以我决定尝试 ios 端然后它仍然给我错误“403 受限客户端”。然后我确定它是服务器端问题。最后我发现忘记设置支持 Google Developers Console > API 和服务 > 证书 > 用户同意屏幕 link 中的电子邮件地址,并且此选项也在您的 Firebase 项目设置中。设置后一切都应该工作。希望这会对您有所帮助。

【讨论】:

以上是关于PlatformException (PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException:的主要内容,如果未能解决你的问题,请参考以下文章

PlatformException(firebase_storage,位置不应是完整的 URL。,,null)

如何捕获 Flutter Google 登录 PlatformException?

在颤动的异步函数中捕获 PlatformException

Flutter:FireBase 抛出的 PlatformException 不会被捕获

PlatformException(error, Given String is empty or null, null) 错误颤动

Flutter 在尝试 Firebase 身份验证时无法捕获 PlatformException