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

时间:2019-02-06 15:47:33

标签: flutter google-signin

已成功打开凭据对话框(Google表单),但是在填写凭据后出现此错误。我遵循了here的指示。创建了一个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.

任何帮助将不胜感激。谢谢!

37 个答案:

答案 0 :(得分:20)

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

1。打开grade.properties 。该文件位于:{{您的项目}} / android / gradle.properties

enter image description here

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

-XX:MaxHeapSize = 256m -Xmx256m

enter image description here

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

enter image description here

4。键入以下命令。

gradlew signingReport

如果首先不起作用,请尝试第二个命令:

./gradlew signingReport

5。等待编译完成,并且应该为您打印出SHA键。

enter image description here

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

答案 1 :(得分:10)

我刚才遇到了同样的问题。如果您在调试中运行,并且没有在firebase中注册sha指纹,则可能会发生这种情况。 我通过生成debug.keystore并将其注册到Firebase上的应用程序中来解决了该问题。之后不要忘记下载新的google-services.json。 另请参见https://developers.google.com/android/guides/client-auth

enter image description here

答案 2 :(得分:9)

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

第1步:生成 SHA1 SHA256 键。
步骤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

答案 3 :(得分:7)

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

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

只需在下面完成以下足够的步骤

  1. 启用 Google 身份验证方法
  2. project-level setting的当前项目中
  3. 配置证书指纹How to Generate certificate
  4. 选择电子邮件作为项目支持电子邮件
  5. google-service.json下载到您的项目中。
  6. 运行flutter clean
  7. 开始flutter run

image

答案 4 :(得分:6)

我找到了错误 com.google.android.gms.common.api.ApiException: 10 的解决方案:我通过向 firebase 添加更多键来解决它。一开始我觉得这很愚蠢而且没用,后来结果证明这是解决方案(我加起来最多 10 个 SHA,如果很多,不要担心)。

  1. 我在哪里找到所有这些钥匙的?

我通过进入 android 文件夹并输入命令 ./gradlew signingReport 找到了所有这些键(我使用的是 linux,它也适用于 mac。对于 windows,命令是 gradlew signingReport

  1. 在那之后?

在那之后,他在我的终端上打印出一长串按键,我把所有不同的都拿了出来,在列表的顶部。

注意:您将获得应用程序每个包的所有密钥(调试和发布),但请放心,所有这些包都是相同的并且仅用于调试(因此您必须使用这些相同的密钥只有一次)

  1. 终于

获得所有应用密钥后,转到项目的 Firebase 设置,向下滚动并添加找到的任何密钥。 之后,您需要再次下载 google-services.json 文件并在计算机上项目的本地文件夹中运行 flutter clean

现在您可以构建您的应用并查看它是否有效!

我希望这可以帮助某人。

答案 5 :(得分:4)

早点给出的答案是对的。它们都不是假的。但是如果您仍然遇到错误 PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)。您应该检查的一件事是您的 OAuth 2.0 Client IDs

enter image description here

  1. 转到:https://console.cloud.google.com/apis/credentials
  2. 在屏幕左上角选择您的项目
  3. 根据您的平台(iOS 或 Android)创建客户端 ID
  4. 只需按照以下步骤操作

成功生成客户端 ID 后,您的应用程序将按预期运行。

--- 注意---

但首先,请确保您已注册 SHA-1package id email support 并已从 Firebase 控制台项目下载 google service json

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

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

  

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

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

  1. 选择您的Firebase项目
  2. 选择Andrid
  3. 在Flutter项目中打开终端
  4. public class User { public int Id { get; set; } [IdColumn(nameof(Client))] public int ClientId { get; set; } [ForeignKey(nameof(ClientId))] public virtual Client Client { get; set; } } public class Client : User { // here are the specific client properties listed } public class File { public int Id { get; set; } [IdColumn(nameof(Owner))] public int OwnerId { get; set; } [ForeignKey(nameof(OwnerId))] public virtual User Owner { get; set; } [IdColumn(nameof(Client))] public int ClientId { get; set; } [ForeignKey(nameof(ClientId))] public virtual Client Client { get; set; } } public class IdColumnAttribute : ColumnAttribute { public const string IdPostFix = "_Id"; public IdColumnAttribute() : base() { } public IdColumnAttribute(string name) : base(name + IdPostFix) { } }
  5. cd android./gradlew signingReport
  6. 粘贴您的包裹名称和SHA1键
  7. 下载客户信息
  8. 下载并替换gradlew signingReport
  9. google-services.json

IOS:

  1. 选择您的Firebase项目
  2. 选择IOS
  3. 输入您的捆绑包ID
  4. 下载凭证
  5. 下载并替换flutter clean

答案 8 :(得分:2)

对于我来说,我不需要添加额外的SHA,我意识到我没有在 Authentication 标签中启用 Google登录方法 Firebase控制台

Enabling google sign-in method in Firebase console

答案 9 :(得分:2)

在Firebase控制台中注册SHA1后,“清理干净”它就是每个人都缺少的东西!

答案 10 :(得分:1)

当我重新安装操作系统时,这也发生在我身上。 只需运行 ./gradlew signingReport 并将 SHA-1 和 SHA-256 复制到 Firebase 配置“添加指纹”

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

答案 13 :(得分:1)

如果以前可以使用,但现在使用的是其他PC​​,则需要将该PC生成的新SHA-1 / SHA-256指纹添加到Firebase中的项目中。一个很好的分步示例:https://stackoverflow.com/a/56091158/5365164

答案 14 :(得分:0)

非常适合我:

所有文件中的minSdkVersion更改为21CTRL+SHIFT< /kbd>+R)

答案 15 :(得分: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 。而且有效。

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

答案 18 :(得分:0)

如果您发布的应用无法正常运行,并且您正在使用Google Play签名,请从您的Play商店帐户中复制SHA ,那么您本地密钥中的一个将无法使用 enter image description here

答案 19 :(得分:0)

遵循其他人建议的步骤 跑步 ./gradlew clean 为我工作。

答案 20 :(得分:0)

我也有同样的问题。

  1. 我已经设置了“同意屏幕”。
  2. 添加了google_play_services.json
  3. 已启用Google登录
  4. 在flutter中添加了必需的插件

但是它不起作用,我得到了相同的API Exception-10,gsm错误

添加SHA1后,它开始工作

答案 21 :(得分:0)

在尝试使用 Google 登录时,手动更改手机上的日期也会导致平台异常。至少使用 flutter google-sign-in 库。

答案 22 :(得分:0)

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

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

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

答案 23 :(得分:0)

请确保您执行以下操作:

答案 24 :(得分: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");
}

我希望这项工作。

答案 25 :(得分:0)

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

答案 26 :(得分:0)

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

答案 27 :(得分:0)

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

答案 28 :(得分:0)

我遇到了问题,花了5个小时才得以解决。我记得我读过某个地方的API异常10表示指纹有问题。因此,它必须是keystore或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中的配置

就是我的意思。希望对您有所帮助。

答案 29 :(得分:0)

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

请参阅问题58194425

答案 30 :(得分:0)

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

您应该在OAuth Consent标签中填写表格。

答案 31 :(得分:0)

确保您已添加

 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 中的applicationId与 AndroidManifest.xml 中的包名称相同(有时您可能会忘记在更改包名称后更改applicationId )。清单文件中的此applicatioonId或程序包名称应为 您在Firebase应用中的android软件包名称的名称。

答案 32 :(得分:0)

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

以下是您需要填写您的应用的同意书的步骤:

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

Your screen should now look like this example by step 6

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

Here is a highlighted example of how these regions should be filled out in step 7

  1. 点击保存

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

答案 33 :(得分:0)

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

答案 34 :(得分:0)

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

答案 35 :(得分:0)

当我可以解决此问题时,我尝试了上述所有方法,但均无济于事。最终我明白了。在我的情况下,我必须确保在Firebase项目设置中设置了Public Setting Support Email

答案 36 :(得分:0)

您可能需要执行其他步骤才能使google_sign_in工作:

][2]

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

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

Firebase

# 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.**