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

279

我成功打开了凭据的对话框(Google表格),但是在填写我的凭据后,我收到了这个错误。我按照这里的指示进行操作。我创建了一个Firebase项目,并从Google APIs控制台启用了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 doctor -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.

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


2
各位注意异常代码 ApiException: 10,首先请参考文档 - https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes 确保您正在解决正确的问题。例如,代码7只表示“没有互联网连接”。 - Kirill Karmazin
运行./gradlew signingReport,它在应用程序Android文件夹下。在Google Firebase Google登录配置中添加SHA1。https://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
55个回答

388

我刚遇到了同样的问题。如果你在debug模式下运行并且没有在Firebase中注册SHA指纹,可能会出现这种情况。我通过运行以下命令生成一个debug.keystore来解决它:
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

然后在应用程序中注册它到Firebase中。不要忘记在此之后下载新的google-services.json

另请参见this

enter image description here

如果您无法在发布模式下使用身份验证,请尝试以下操作: - 添加发布密钥的SHA证书指纹。 keytool -exportcert -list -v \ -alias <your-key-name> -keystore <path-to-production-keystore> 有关详细信息,请参见此处的“获取发布证书”部分https://developers.google.com/android/guides/client-auth 如果您的身份验证仍然无法正常工作,可能是因为您从Playstore下载了应用程序并启用了“Google Play功能的应用签名”。 然后,对于这种情况,请转到Play商店发布控制台,并在发布管理下转到应用程序签名。 在那里,您将找到要在Firebase控制台中注册的SHA证书指纹。

enter image description here


44
谢谢您的反馈。这很有帮助。值得注意的是,必须添加SHA1和SHA256密钥才能使认证正常工作。 - Srini
2
@TSR 这个方法可行,但我不需要下载新的 google-services.json 文件。 - Darren Cole
7
顺便提一下,即使我配置了SHA指纹仍然出现相同的错误。原来我还需按照 https://github.com/flutter/flutter/issues/25909#issuecomment-497378619 的说明添加支持电子邮件地址。 - Michael Nelson
9
你的编辑并引用“如果您使用Android App Bundle发布了应用程序,使用Play App Signing是必需的,您可以从Google Play控制台的Release > Setup > App Integrity页面获取SHA-1”,对我非常有帮助!谢谢! - adrianvintu
如需额外支持,请参考https://dev59.com/mFQK5IYBdhLWcg3wc_fg#56091158。 - Wimukthi Rajapaksha
显示剩余7条评论

157

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

1. 打开grade.properties 该文件位于:{{YOUR PROJECT}}/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密钥将会被打印出来。

图片描述

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


3
对我来说那是唯一有效的方法,我的keytool生成的SHA-1 / SHA-256无法使用。 - PRO GRAMMER
5
如果第四步没有成功,请使用以下方式调用gradlew:./gradlew signingReport。 - Tincho825
2
补充一句,这也是我唯一有效的方法。在找到这个方法之前,我尝试了其他所有方法并花了几天时间来解决这个问题。 - Mark Rawlingson
3
最佳答案。完美。 - WizardingStudios
2
好的,已经生效了,谢谢。顺便说一下,如果你遇到堆内存错误,请尝试使用以下参数:-XX:MaxHeapSize=256m -Xmx1536M - Umut Çağdaş Coşkun
显示剩余10条评论

106

打开 Firebase 控制台并点击设置图标。

您将看到连接到 Firebase 项目的应用程序列表

对于 Android

  1. 在 Flutter 项目内打开终端
  2. cd android
  3. ./gradlew signingReportgradlew signingReport
  4. 粘贴您的 SHA1 密钥
  5. 下载并替换 google-services.json
  6. flutter clean

IOS:

  1. 配置 Firebase 项目
  2. 选择 IOS
  3. 输入 Bundle ID
  4. 下载凭据
  5. 下载并替换 GoogleService-info.plist

将此添加到您的 info.plist 中

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>**INSERT HERE YOUR RESERVED_CLIENT_ID FROM GoogleService-Info.plist**</string>
        </array>
    </dict>
</array>

4
gradlew signingReport 对我帮助很大,因为起初我使用了错误的密钥库。而使用该命令,您可以确保得到正确的密钥库。 - BHuelse
谢谢,我整天都在苦苦寻找解决方案,我给了你一个赞 :) - Malek Tubaisaht

104

28
清洁非常重要。 - mkkhedawat
这是正确的解决方案。此外,如果 Firebase 包名称和项目包名称(路径)不匹配,则仍会收到错误代码:10。 - ege men

42
当我遇到这个问题时,我尝试了这篇文章中描述的所有其他解决方案,但都没有奏效。最终,我弄清楚了原因:在我的情况下,我必须确保设置了我的“支持电子邮件”。

公共设置支持电子邮件


这很有帮助,谢谢分享! - Miki

34

对我来说,我不需要添加额外的SHAs,我意识到我没有在Firebase控制台身份验证选项卡中启用Google登录方法

在Firebase控制台中启用Google登录方法


尝试了所有其他方法,才意识到你的简单解决方案正是我所需要的! - SqueezeOJ

21

使google_sign_in正常工作可能需要执行以下步骤:

][2]

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

console 您应该最终拥有至少6个SHA凭据:来自调试密钥的2个、Google Play链接的2个以及发布密钥的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.**

20
如果您发布的应用程序无法正常工作,并且您正在使用Google Play签名,请从您的Play商店帐户中复制SHA,本地密钥中的SHA将无法使用。enter image description here

1
谢谢!这是让我花费数小时进行试错的应用程序投入生产中所缺少的关键步骤。其他解决方案只适用于构建调试版本。 - user2897738
我遇到了一个问题,我的应用程序曾经在Google Play应用商店上运行良好,但突然间无法工作,而不幸的是,“应用签名”部分已不再可用。 - Alexa289
啊,我明白了,现在它在“应用完整性”部分。然后将该SHA-1证书指纹复制到Firebase控制台(项目设置->常规->向下滚动,直到看到您的Android应用程序)。 - Alexa289

15

我找到了解决 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

现在,您可以构建您的应用程序并查看是否正常工作!

我希望你可以帮助某个人。


1
谢谢您的评论。我终于解决了它。 :) - ishallwin

10
之前提供的答案都是正确的,没有错误。但如果你仍然遇到了这个错误PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null),那么你需要检查一下你的OAuth 2.0客户端ID

enter image description here

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

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

--- 注意 ---

但首先,请确保您已注册了SHA-1包ID电子邮件支持并从Firebase控制台项目中下载了Google服务JSON


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接