Flutter和google_sign_in插件:PlatformException(sign_in_failed,com.google.android.gms.common.api.ApiException:10:,null)


100

凭证对话框(Google表单)已成功打开,但是在填写凭证后出现此错误。我遵循了这里的指示。创建了一个Firebase项目,并从Google API控制台启用了Google Drive API(这是我现在需要的)。

代码抛出异常:

final GoogleSignIn _googleSignIn = GoogleSignIn(
  scopes: [
    'https://www.googleapis.com/auth/drive',
  ],
);

await _googleSignIn.signIn();

那是堆栈跟踪:

E/flutter ( 5068): [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:
E/flutter ( 5068): PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)
E/flutter ( 5068): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:551:7)
E/flutter ( 5068): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:292:18)
E/flutter ( 5068): <asynchronous suspension>
E/flutter ( 5068): #2      GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:226:58)
E/flutter ( 5068): <asynchronous suspension>
E/flutter ( 5068): #3      GoogleSignIn._addMethodCall (package:google_sign_in/google_sign_in.dart:268:20)
E/flutter ( 5068): #4      GoogleSignIn.signIn (package:google_sign_in/google_sign_in.dart:339:48)
E/flutter ( 5068): #5      ThatsMyComponentState.theSignInFuction.<anonymous closure> (package:my_app/widgets/my_file.dart:666:45)
E/flutter ( 5068): <asynchronous suspension>
E/flutter ( 5068): #6      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
E/flutter ( 5068): #7      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
E/flutter ( 5068): #8      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
E/flutter ( 5068): #9      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
E/flutter ( 5068): #10     TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:204:7)
E/flutter ( 5068): #11     GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
E/flutter ( 5068): #12     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:184:20)
E/flutter ( 5068): #13     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:158:22)
E/flutter ( 5068): #14     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:138:7)
E/flutter ( 5068): #15     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7)
E/flutter ( 5068): #16     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7)
E/flutter ( 5068): #17     _invoke1 (dart:ui/hooks.dart:168:13)
E/flutter ( 5068): #18     _dispatchPointerDataPacket (dart:ui/hooks.dart:122:5)

google_sign_in插件的版本为4.0.0。

那是flutter doctot -v的输出:

[√] Flutter (Channel stable, v1.0.0, on Microsoft Windows [Version 10.0.17763.253], locale en-US)
• Flutter version 1.0.0 at C:\src\flutter-0.7.3\flutter
• Framework revision 5391447fae (10 weeks ago), 2018-11-29 19:41:26 -0800
• Engine revision 7375a0f414
• Dart version 2.1.0 (build 2.1.0-dev.9.4 f9ebf21297)

[√] Android toolchain - develop for Android devices (Android SDK 28.0.3)
• Android SDK at C:\Users\myuser\AppData\Local\Android\Sdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-28, build-tools 28.0.3
• ANDROID_HOME = C:\Users\myuser\AppData\Local\Android\Sdk
• Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)
• All Android licenses accepted.

[√] Android Studio (version 3.3)
• Android Studio at C:\Program Files\Android\Android Studio
• Flutter plugin version 32.0.1
• Dart plugin version 182.5124
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1248-b01)

[!] IntelliJ IDEA Community Edition (version 2018.1)
• IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.1.6
X Flutter plugin not installed; this adds Flutter specific functionality.
X Dart plugin not installed; this adds Dart specific functionality.
• For information about installing plugins, see
  https://flutter.io/intellij-setup/#installing-the-plugins

[!] VS Code, 64-bit edition (version 1.30.2)
• VS Code at C:\Program Files\Microsoft VS Code
• Flutter extension not installed; install from
  https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[√] Connected device (1 available)
• Android SDK built for x86 • emulator-5554 • android-x86 • Android 8.1.0 (API 27) (emulator)

! Doctor found issues in 2 categories.

任何帮助都感激不尽。谢谢!


所有:注意异常代码ApiException: 10和参考文档第一- developers.google.com/android/reference/com/google/android/gms/...确保您固定正确的问题。例如,代码7仅表示“没有互联网连接”。
Kirill Karmazin

运行./gradlew signingReport,它位于应用程序Android文件夹下。在Google Firebase Google登录配置中添加SHA1。developers.google.com/android/guides/client-auth。每台工作的计算机都需要一个SHA1。
live-love

@KirillKarmazin知道12500是什么吗?E / flutter(23795):[ERROR:flutter / lib / ui / ui_dart_state.cc(157)]未处理的异常:PlatformException(sign_in_failed,com.google.android.gms.common.api.ApiException:12500:,null)
raiton

Answers:


155

我刚才遇到了同样的问题。如果您在调试中运行并且SHA在firebase中注册指纹,则可能会发生这种情况。我通过生成一个debug.keystore并在Firebase上的应用程序中注册了它来解决了它。之后不要忘记下载新的google-services.json。另请参见

在此处输入图片说明

编辑 如果无法在发布模式下使用身份验证,请尝试以下操作:

-添加释放密钥的SHA证书指纹。

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

有关此内容的更多详细信息,请参见此处"get release certificate" https://developers.google.com/android/guides/client-auth

如果您的身份验证仍然不起作用,可能是因为您从Playstore下载了应用程序,并且启用了 “通过Google Play功能进行应用程序签名” 。在这种情况下,请转到Play商店发布控制台,然后在发布管理下转到应用程序签名。在那里,您会找到要在Firebase控制台中注册的SHA证书指纹。

在此处输入图片说明


19
谢谢你 这有帮助。值得一提的是,必须同时添加SHA1和SHA256密钥才能使身份验证正常工作
Srini,

2
接受此作为答案。
Muruganandham K

@TSR可行,但我不必下载新的google-services.json。
达伦·科尔

2
仅供参考,即使配置了sha指纹,我也遇到了相同的错误。原来,我还必须根据github.com/flutter/flutter/issues/25909#issuecomment-497378619添加支持电子邮件地址。
Michael Nelson

@MichaelNelson这也是我的问题
Tobias

44

以下解决方案在flutter项目中适用:

步骤1:生成SHA1SHA256密钥。
步骤2:将SHA1和SHA256都添加到Firebase。(在您的应用程序设置中)
步骤3:将google-services.json下载到项目文件夹中的android / app
步骤4:在您的终端中运行命令flutter clean
第5步:运行您的Flutter应用。

有关更多信息,请访问:
https : //developers.google.com/android/guides/client-auth
https://firebase.google.com/docs/flutter/setup


10
清洁非常重要
mkkhedawat

28

当我遇到此问题时,我尝试了本文中介绍的所有其他解决方案。这些都不起作用。最终,我弄清楚了:在我的情况下,我必须确保设置“支持电子邮件”。

公共设置支持电子邮件


这对我有用。
dvallejo

27

您需要使用软件包配置Google Cloud Api项目。

https://developers.google.com/identity/sign-in/android/start-integrating#configure_a_project

确保使用相同的Firebase帐户登录

  1. 选择您的Firebase项目
  2. 选择Android
  3. 在Flutter项目中打开终端
  4. cd android
  5. ./gradlew signingReport 要么 gradlew signingReport
  6. 粘贴您的软件包名称和您的SHA1密钥
  7. 下载客户信息
  8. 下载并替换 google-services.json
  9. flutter clean

iOS:

  1. 选择您的Firebase项目
  2. 选择IOS
  3. 输入您的捆绑ID
  4. 下载凭证
  5. 下载并替换 GoogleService-info.plist

2
gradlew signingReport对我有很大帮助,因为首先我只是使用了错误的密钥库。使用该命令,您肯定会找到正确的命令。
BHuelse

25

我花了很长时间试图解决这个问题。

1.打开grade.properties此文件位于以下位置:{{YOUR PROJECT}} / android / gradle.properties

在此处输入图片说明

2.将以下参数添加到“ org.gradle.jvmargs”,如屏幕截图所示。

-XX:MaxHeapSize = 256m -Xmx256m

在此处输入图片说明

3.右键单击“ gradlew”,然后转到“在终端中打开”。 此文件位于{{YOUR PROJECT}} / android / gradlew下

在此处输入图片说明

4.键入以下命令。

gradlew signingReport

如果没有成功,请尝试第二个命令:

./gradlew signingReport

5.等待编译完成,并且应该为您打印SHA密钥。

在此处输入图片说明

使用这些密钥在https://console.firebase.google.com/中对您的应用进行身份验证


1
对我来说,这是唯一有效的方法,我的keytool生成了不起作用的SHA-1 / SHA-256
PRO GRAMMER

4
如果第4步不起作用,请改用gradlew代替:./gradlew signingReport
Tincho825 '20

1
告诉我这也是唯一对我有用的东西。尝试了所有其他内容,并花了几天时间尝试解决问题,然后再找到此问题。
Mark Rawlingson,

收到此错误:无法初始化类org.codehaus.groovy.runtime.InvokerHelper
Ramis

这是最简单的方法!这应该被接受。
reverie_ss


7

您可能需要采取其他步骤才能使google_sign_in工作:

] [2]

  • 如果您可以在调试期间运行Google登录,但不能在发行版中运行Google登录,则很有可能没有将发行密钥的SHA1和SHA256添加到Firebase中。要获取释放密钥的SHA,请使用keytool -list -v -keystore ~/key.jks -alias key

安慰 您最终应获得至少6个SHA凭据:2个来自调试密钥,2个来自Google Play链接,2个来自发行密钥。请注意,在将发行版SHA凭据添加到firebase之后,您无需重新下载google-services.json文件。

火力基地

# Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }

# GooglePlay Services
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**
-keep class com.google.common.** { *; }
-dontwarn com.google.common.**

7

您错过了在Firebase上启用Google登录的配置步骤。

您已连接的iOS和网络应用会自动配置Google登录。要为您的Android应用设置Google登录,您需要在项目设置中为每个应用添加SHA1指纹。

只需完成以下足够的步骤

  1. 启用Google身份验证方法
  2. 在的当前项目中配置证书指纹project-level setting如何生成证书
  3. 选择项目支持电子邮件的电子邮件
  4. 下载google-service.json到您的项目中。
  5. flutter clean
  6. 开始 flutter run

图片


6

在Firebase控制台中注册SHA1后,“清理干净”其是每个人都缺少的部分!


4

对于平台异常10,请尝试以下操作:

  1. 在计算机上生成新的SHA1指纹,
  2. 在Firebase控制台中转到您的Firebase Android应用程序设置
  3. 在您的Android应用设置中点击添加新指纹
  4. 将新的SHA1指纹粘贴到字段中
  5. 生成一个新的json配置文件
  6. 替换android目录中的配置文件
  7. 运行扑干净
  8. 运行你的项目

3

您可能会遇到此错误的一个原因是,如果您没有填写Google的OAuth同意书。这是对Firebase的新更改。

您需要按照以下步骤填写应用同意书:

  1. 导航至google api控制台(当前位于https://console.developers.google.com),确保您已登录创建Firebase项目的帐户。
  2. 从开发者控制台左上方的“选择项目”下拉列表中选择您的项目。
  3. 在左侧窗格中,转到“凭据”,然后切换到“ OAuth同意屏幕”。
  4. 在“应用程序名称”下输入您应用程序的公共名称
  5. 在“应用程序徽标”下,上传您的应用程序的本地图像文件
  6. 在“支持电子邮件”下,输入Firebase应用程序中列出的相同支持电子邮件。

现在,您的屏幕应该看起来像第6步中的示例

  1. 向下滚动并在Firebase应用程序所在的授权域之前添加http://,以填写“应用程序主页链接”,“应用程序隐私权政策链接”和“应用程序服务条款链接” 。

这是在第7步中如何填写这些区域的突出示例

  1. 点击保存

这些步骤对我有用!虽然链接可能不会依然存在,我想引用此解决方案的来源在这里


它实际上是这个问题的答案吗?
布拉特

感谢您的反馈。我尝试将答案更新为更具体-请让我知道现在是否合适-如果不合适,我将如何改进它。
Ben Elliott

1
您需要“提交验证”还是“保存”?
更简单的

2

这似乎很愚蠢,但这只是我现在的事情(过去有过使用Firebase的经验)。我注意到我没有启用Google身份验证。确保执行此操作,因为您可能仍会看到登录提示(显示手机的google用户,而未启用该功能)。


我在哪里启用thant?
艾哈迈德·阿尔巴底

@AhmedAlbarody在Firebase控制台中-选择“身份验证”,然后您需要启用要使用的服务。
盖伊,

1

确保SHA-1必须是仅在您的系统中生成的调试密钥,然后下载google-services.json文件,将其附加到您的项目中


1

确保您已添加

 dependencies {
    classpath 'com.google.gms:google-services:4.2.0'
}

在android / build.gradle和

apply plugin: 'com.google.gms.google-services'

android / app / build.gradle中。另外,请确保android / app / build.gradle中的applicationIdAndroidManifest.xml中的包名称相同(有时可能会在更改包名称后忘记更改applicationId)。清单文件中的此applicatioonId或程序包名称应为Firebase应用程序中android程序包名称的名称。


1

您应该为使用的每台PC生成SHA-1和SHA-256。并将它们全部添加到firebase项目设置中。

并且您应该在OAuth同意标签中填写表格。



1

但是,上面给出的答案是正确的,但是,如果您遇到问题,请不要忘记验证app / build.gradle的signingConfig {}部分。它不应包含任何不需要的密钥库文件引用,这可能会导致与google-services.json和密钥库不匹配。


1

在我的情况下,这是一个愚蠢的错误,请确保您在firebase中的applicationId(例如:“ com.example.appname”)与defaultconfig {}下的app / src / build.gradle文件中的applicationId完全匹配。没有拼写错误,没有大写,小写字母冲突。在我的情况下,一个字母是大写字母,这会引起所有问题。


0

android / app / build.gradle中,我将依赖项从com.android.tools.build:gradle:3.1.3 / com.google.gms:google-services:3.2.1更改为com.android.tools.build:gradle :3.2.1 / com.google.gms:google-services:4.2.0。而且有效。


0

在Firebase中注册应用程序时,我将applicationId更改为适合我的应用程序的名称。但是,这导致在我运行调试器时在手机上安装了第二个Flutter应用程序(当然,由于applicationId的更改)。因此,适合我的情况的是remove安装和re-install应用程序。


0

我尝试了以上所有内容,但没有任何效果。我的错误是我的驱动器中有多个android studio版本文件夹,而我在firebase设置中输入了错误的SHA1密钥。


0

构建一个appbundle(由Google Play和Flutter推荐)将导致此错误。构建apk将解决此问题。

参见问题58194425


0

我遇到了问题,花了5个小时才解决了问题。我记得我在某处读到API异常10表示指纹有问题。因此,它必须是密钥库或Firebase中的错误配置。最终,它是密钥库。我仍然不确定为什么这行得通,但是顺便说一下,我正在使用Windows 10:

1.)确保在文件android / build.gradle上,我具有以下内容:

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.1'
        classpath 'com.google.gms:google-services:4.2.0'
    }
}

2.)我将这两行添加到文件android / gradle.properties中

android.useAndroidX=true
android.enableJetifier=true

3.)导航到C:\ Users \ YOURUSER \ .android并删除以下内容:

debug.keystore
debug.keystore.lock

4.)以admin身份打开终端,并在此目录中生成调试密钥库。

$ keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000

获得指纹:

$ keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android 

5.)将SHA1指纹添加到firebase中的配置

这就是我的目的。希望对您有所帮助。


0

请确保您仍在开发中的Firebase控制台上使用的签名证书与app / build.gradle文件中的signingConfigs >> debug配置中使用的签名证书相同。不匹配导致错误。


0

这为我解决了。我在一个新项目中做了一个小的重构。我以为我使用的是旧google-services.json文件,但使用的文件错误。在意识到这个简单错误之前,我尝试了其他两天。


0

这对我有所帮助(导入SHA1时遇到问题)

cd .android我使用并复制了SHA1密钥,并粘贴到了Firebase,项目配置,Android应用程序,SHA证书中

keytool -list -v -keystore debug.keystore -alias androiddebugkey -storepass android -keypass android

我还用以下方法创建了一个密钥:

keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkeytwo -keypass android -keyalg RSA -keysize 2048 -validity 10000

并使用了另一个SHA密钥:

keytool -list -v -keystore debug.keystore -alias androiddebugkeytwo -storepass android -keypass android

我复制并粘贴了在我的Firebase项目中添加另一个密钥。

还下载了google-services.json并粘贴到flutter项目中的Android / app中。

这工作正常,我的pubspec.yml依赖:

  http: ^0.12.0+2
  cupertino_icons: ^0.1.2
  firebase_auth: ^0.15.1
  firebase_analytics: ^5.0.6
  firebase_core: ^0.4.2+1
  google_sign_in: ^4.0.14

我的代码:

    Widget _signInButton() {
    return OutlineButton(
      splashColor: Colors.grey,
      onPressed: () async {
        await signInWithGoogle()
            .then((FirebaseUser user) => print(user.displayName))
            .catchError((e) => print(e));

      },

    );
  }

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn googleSignIn = new GoogleSignIn();

Future<FirebaseUser> signInWithGoogle() async {
  final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
  final GoogleSignInAuthentication googleSignInAuthentication =
      await googleSignInAccount.authentication;

  final AuthCredential credential = GoogleAuthProvider.getCredential(
    accessToken: googleSignInAuthentication.accessToken,
    idToken: googleSignInAuthentication.idToken,
  );

  final AuthResult authResult = await _auth.signInWithCredential(credential);
  final FirebaseUser user = authResult.user;
  print(user.displayName.toString());
  assert(!user.isAnonymous);
  assert(await user.getIdToken() != null);

  final FirebaseUser currentUser = await _auth.currentUser();
  assert(user.uid == currentUser.uid);

  return user;
}

void signOutGoogle() async {
  await googleSignIn.signOut();

  print("User Sign Out");
}

我希望这项工作。



0

我收到此错误:PlatformException(sign_in_failed,com.google.android.gms.common.api.ApiException:7:,null)也许解决方案对您。

而且我意识到我的调试设备(Android调试模式)未连接到互联网。我认为身份验证失败,因此方法返回null或user等于null。

返回的变量必须在使用前检查。


我发现很难遵循您的答案:您能使用英语(不是我的第一语言)获得帮助吗?
灰胡子

0

就我而言,没有任何答案可以解决问题。经过一番思考,我意识到一段时间前我已经更改了应用程序的软件包名称。如果是这种情况,您只需在Firebase项目中使用新的程序包名称创建另一个应用程序,然后再次下载google-services.json文件。


0

如果您发布的应用程序无法正常运行,并且您正在使用Google Play签名,请从您的Play商店帐户中复制SHA,然后从本地密钥中复制一个 在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.