Why do I get com.google.android.gms.common.api.ApiException: 10:?

private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class); //exception is here


// Signed in successfully, show authenticated UI.
System.out.println("google token ---> " + account.getIdToken());
} catch (ApiException e) {
// The ApiException status code indicates the detailed failure reason.
// Please refer to the GoogleSignInStatusCodes class reference for more information about this error.
e.printStackTrace();
}
}
129921 次浏览

此状态代码意味着您正在提供未知的服务器客户端 ID。 在项目的 https://console.developers.google.com/apis/credentials中,您可能需要生成: OAuth 客户端 ID-> Web Application,并在这里使用这个 Web 应用程序客户端 ID:

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(webApplicationClientId)
.requestEmail()
.build()

引用 文件的话:

某些 Google Play 服务(如 Google 登录和应用邀请) 要求您提供您的 SHA-1签署证书,以便我们可以 为你的应用程序创建一个 OAuth2客户端和 API 密钥。

如果你正在使用 Firebase并试用 debug app:

首先,获取 SHA-1调试密钥:

  1. 点击 Gradle(从右侧面板,你会看到梯度条)
  2. 点击 Tasks
  3. 点击 Android
  4. 双击 signingReport(你会得到 SHA-1MD5)

2. 将你的密钥添加到 Firebase项目中:

  1. 转到 Project settings-> SHA certificate fingerprints-> 添加 SHA-1键的调试应用程序。

  2. 然后你可以在你的 Android 项目中更新你的 google-services.json文件。

对我有用。

如果你删除这一行,它将工作:

System.out.println("google token ---> " + account.getIdToken());

这是因为您没有对 idToken 的请求:

.requestIdToken(getString(R.string.google_app_id))

其中 app_id的值为“ OAuth client ID-> Web Application”

ApiException 错误代码10是开发人员错误。当你的 Firebase 应用程序配置不当时会出现这个错误。一个确定的情况是,当你想使用谷歌登录的 Firebase 认证时,你没有为你的 Android 应用程序提供 SHA1指纹。(这是 Google 登录的必要条件)。 提供 SHA1指纹,下载谷歌服务。Json 配置文件到您的应用程序文件夹并构建。你应该可以走了。

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

看看这个 常见状态错误代码

我用以下步骤解决了这个问题:

如果已经创建了,则转到 https://console.developers.google.com/并删除(Android 客户端)。

点击 CreateCredential,点击 OAuthClientID,选择 android

3)复制并粘贴你的 SHA 1指纹

4)。输入您的软件包名称,然后保存

5) console.firebase.com

6) . 下载 google-service. json 将它移动到你的项目应用程序目录中

7)打开 google-service. json,找到客户端 id 类型3,并使用它作为 default _ web _ client _ id

8)运行你的应用程序

这是因为您使用了错误的 default _ client _ token _ id。 要解决这个问题,请转到从 firebase 下载的 JSON 文件并打开它: 您的 client _ id 位于 “ certificate _ hash”: xxxxxxzxzzzxxzxxzxxxzxxxzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx。 祝你好运:)我希望这对你有帮助。

当你正在做谷歌登录设置,它通常采取签名密钥存储哈希键。所以尝试与签署 APK 然后它将工作。为了调试尝试添加您的调试 SHA 键在谷歌控制台。

在我的情况下,它解决了通过重新连接我的 安卓工作室火力点

别忘了加上

<application
...
<meta-data
android:name="com.google.android.gms.wallet.api.enabled"
android:value="true" />
...
</application>

在您的清单文件应用程序标记下。 在我的情况下,问题是因为缺少这些行。

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(OAUTH_2_CLIENT_ID)
.requestEmail()
.build()
val mGoogleSignInClient = GoogleSignIn.getClient(this, gso)
val signInIntent = mGoogleSignInClient.signInIntent
startActivityForResult(signInIntent, GOOGLE_LOGIN)

OAUTH _ 2 _ CLIENT _ ID 是 Web 客户端(由 Google Service 自动创建),不是 Android

我想这个问题已经有答案了,但是对我来说有点不一样,所以 如果一些谷歌员工也遇到了和我一样的问题:

特殊情况

  • 多个防火基地项目
  • 客户身份白名单
  • 通过应用程序共享安装的应用程序不能与谷歌注册

以防有人在同一个应用程序中使用 多个防火基地项目(即不同风格的应用程序) ,并在一个项目中将 Google-Authentication 的“外部”客户身份证列入白名单。

然后,解决方案是,在“主”/白名单项目的 Google API控制台中与另一个项目的 sha-1(在应用程序共享中找到)一起生成新凭证。

向 API 控制台添加新凭据

  1. 转到 白名单项目的 Google API
  2. 创建新的 OAuth客户端 ID
  3. 添加所需的一切,也包名称的其他项目
  4. 粘贴来自其他项目的应用程序共享的 SHA-1散列

成交

对不起,我的英语不好,这不是我的母语。

在我的例子中,问题出在 SHA1和 google-services. json 文件上

我按照以下步骤解决了这个问题:

1.-在 OAuth 2.0客户端 ID 中打开 https://console.cloud.google.com/apis/credentials并删除文件

2.- 打开 https://console.firebase.google.com/循环齿轮图标-> 项目设置-> 选择您的 Android 应用程序-> 添加指纹-> 保存-> 和下载谷歌服务。Json 文件

3.-打开你的 android 项目,并将 de google-services. json 文件替换为-> 用 Gradle 文件替换循环同步项目

4.-新的 default _ web _ client _ id at value 对我来说很好用,并且解决了问题

我的问题是试图使用谷歌登录尚未 我不小心在 Firebase 中输入了错误的 SHA1。尝试运行 Gradle > Your app name > Tasks > android > signingReport,获取您的 SHA1键,并将其与 Firebase 上的键进行比较。如果它们不同,则更改 Firebase SHA1密钥以匹配您从 signingReport 获得的密钥。别忘了之后还要下载 Google-services. json

ApiException 10DEVELOPER_ERROR,这意味着应用程序配置有问题。

这个 回答对我很有用,但后来我意识到我们的应用程序是通过后端服务器进行身份验证的。因此,如果您的应用程序使用后端服务器进行身份验证,那么您只需要使用 Web 应用程序客户端 ID。但是您仍然需要创建 Android 类型的客户端 ID,否则将得到 ApiException 12500 。你可以从 文件阅读更多关于它的内容。(请注意链接有 authuser=0)

我有这个东西在2-3% 的场合在生产,它的工作无缝其他人。

鉴于问题的数量和不同的答案,这是造成的,这是公平地说,这是一个问题的代表消防队。他们实现了一个包罗万象的错误例程,这只是糟糕的 API 设计。API 必须指出它失败的地方。

一个长期的解决方案是让 firebase 相信这是糟糕的 api 设计,他们需要做得更好。

我们在一起很强大。

请写一张支持票到消防队大致如下:

嘿,火力支援,

我有一个 com.google.android.gms.common.api。 APIException: 10在我的应用程序中。

对我以及论坛上的很多人来说,问题是 你的 API 似乎有一个包罗万象的错误程序 说话就是在说“出了问题,请修好它”。

你可以让你的支持团队和很多人摆脱头痛 如果你能解决这个问题。

API 应该能够指出哪里出错了,并给出一个更好的错误 消息来自发生它的上下文。

这真的是一个负担,我认为,因为消防队有一个 在安卓系统上对这些事情进行准垄断是你的义务 好多了。

虽然这显然不是你的错,但我想鼓励你这么做 使问题升级。

它从根本上说是糟糕的 API 设计,并且损害了一个 产品。

还是谢谢你。

我通过重做 FirebaseAuth 连接来解决这个问题。

  1. 点击右上角的小方块登录到您的谷歌帐户
  2. 转到 Tool-> Firebase
  3. 选择 Authentication
  4. 连接

之后,它可能会说您已经连接,但是您需要更新连接。之后就没问题了。我想有时候 Android Studio 会和不同的 Firebase 帐号混在一起。

我得到了同样的错误,但我从谷歌云控制台获得了网络客户端令牌,并将其放置在声明 GoogleSignInOptions 的地方。替换

.requestIdToken("getString(R.string.default_web_client_id)")

与您的特定 Google 云项目的 Web 客户端 ID。

我用的是文件上的这个命令。

 keytool -exportcert -keystore ~/.android/debug.keystore -list -v

我只是把它改成

 keytool -exportcert -keystore ./.android/debug.keystore -list -v

并使用 SHA-1并将其复制到防火基地机器人部分。 这样就行了。

如果您不使用自己的后端服务器,那么 不需要将提供 OAuth 2.0客户机 ID (如它所说的 给你)。当然,请检查您是否提供了正确的 SHA-1代码,但是请记住,您提供的是 释放变体 SHA-1键,因此当您试图使用带有调试应用程序变体的 Google SignIn 时,可能会出现此错误。所以你有两个选择:

  1. 构建并运行版本 APK
  2. 将您的调试 SHA-1键添加到 Firebase 控制台,然后您将能够运行您的调试 APK,而不会出现此异常

可能的解决办法:

如果您曾经重命名过项目的包,请检查 AndroidManifest.xml 中的包名和 app gradle 文件中的 applicationId 是否相同。 当我将 applicationId 命名为我的应用程序包时,它帮助了我

由于错误的客户端 ID 导致此错误

GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();

必须将服务器的客户端 ID 传递给 requestIdToken 方法。

在 google-services. json 文件中可以很容易地找到客户 ID

{
"client_id": "",
"client_type": 3
}

不需要进入 GCP 控制台的凭据页面。

请按照

Https://firebase.google.com/docs/auth/android/google-signin

对我来说,这个错误很简单,我在 oncreate 回调之外初始化了谷歌登录选项。

根据我的经验,这是一个与 SHA1的问题。解决方案为我工作:

  1. 如果您已经创建了 OAuth 清单(可能是可选的) ,请删除它
  2. 在项目终端 keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android中启动此命令并复制 SHA1指纹。
  3. 转到 Firebase 控制台,单击您的项目齿轮并删除旧的指纹。将它们替换为您在步骤2中复制的那个
  4. 下载新的 google-services.json文件并替换旧的
  5. 同步项目与 Gradle 文件。

应该能用:)

如果你来这里是因为与 谷歌登录 iOS 和 Android统一库的错误,这是什么帮助了我。

我改变了谷歌的项目,并继续得到 ApiException: 10。我后来发现,这是因为 你需要使用网络客户端,而不是 Android 客户端

如果你想检查你是否有一个网络客户端或 Android 客户端,打开 client_secret_(some text).apps.googleusercontent.com.json文件-如果它以 {"web"开始,它是一个网络客户端。


更换客户端的分步说明:

  1. 从 Unity 项目中删除 client_secret_(some text).apps.googleusercontent.com.json文件。如果你也有一个 plist 文件(针对 iOS) ,不要删除它。
  2. 转到 给你,点击“配置一个项目”并配置一个 Android 客户端。
  3. 转到 GoogleCloud证件页面(如果需要,选择您的项目) ,下载自动生成的 Web 客户端并将其放在您的项目中。
  4. 单击“资产”> 外部依赖管理器 > Android Resolver > 强制解决方案。
  5. 在调用此函数的脚本中更改传递给 LCGoogleLoginBridge.InitWithClientID的客户端 ID。
  6. 生成并查看问题是否已得到解决。

我也面临着同样的问题。我用的是 SHA-1认证。但问题是,我使用 Android Studio 的 Run 按钮直接将应用程序安装到测试设备上。通过这种方式,我没有在 Android Studio 中定义用于创建 SHA-1指纹的调试密钥库。

设置 debugKeyStore 在 Android Studio 中 debug. keystore 在哪里

如果使用 Google 内部共享进行测试,请确保添加内部共享的 SHA 字符串(安装程序-Google Play Console 中的内部应用程序共享)