com.google.android.gms.common.api.ApiException:16:

Posted

技术标签:

【中文标题】com.google.android.gms.common.api.ApiException:16:【英文标题】:com.google.android.gms.common.api.ApiException: 16: 【发布时间】:2019-02-23 17:49:12 【问题描述】:

我尝试了解如何在我的 android 应用程序中使用 google 登录,但我发现 com.google.android.gms.common.api.ApiException: 16 而且我在stackoveflow上找不到答案,它是什么以及为什么我抓住它。在我阅读的文档中,它“被用户取消”,但我的谷歌帐户接受安装应用程序

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import android.content.Intent
import com.google.android.gms.tasks.Task
import com.google.android.gms.common.api.ApiException

class MainActivity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

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

        val mGoogleSignInClient = GoogleSignIn.getClient(this, gso)
        val account = GoogleSignIn.getLastSignedInAccount(this)
        if(account != null)
            Log.e("!!!", account.email)
         else 
            val signInIntent = mGoogleSignInClient.signInIntent
            startActivityForResult(signInIntent, 0)
        
    

    public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        super.onActivityResult(requestCode, resultCode, data)

        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == 0) 
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            handleSignInResult(task)
        
    

    private fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) 
        try 
            val account = completedTask.getResult(ApiException::class.java)

            // Signed in successfully, show authenticated UI.
            Log.e("!!!", account.email)
         catch (e: ApiException) 
            e.printStackTrace()
        

    


我关注了this guide。做了项目的配置。 如果有关系,我会为此使用 VDS。帐户是在同一个地方创建的

这里是堆栈跟踪:

com.google.android.gms.common.api.ApiException: 16: 
    at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source)
    at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source)
    at foryou.friendly.alisa.alisa.MainActivity.onActivityResult(MainActivity.kt:47)
    at android.app.Activity.dispatchActivityResult(Activity.java:7124)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4173)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4220)
    at android.app.ActivityThread.-wrap20(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1579)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:163)
    at android.app.ActivityThread.main(ActivityThread.java:6228)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)

【问题讨论】:

你能发布完整的异常堆栈跟踪吗?以及您在其中提到的所有代码。 @Ircover 更新问题! 也许你应该检查onActivityResult 方法上的resultCode 值。它应该等于RESULT_OK @Ircover 我发现'RESULT_CANCELED',但我不明白为什么 Here is 一些要求。你适合他们吗? 【参考方案1】:

我遇到了同样的问题,开始活动结果不断返回 RESULT_CANCELED 和错误代码 16。问题是我在 Google Cloud Platform Console 中的客户端配置。我使用的是常规调试和发布 api 密钥。当我使用 Web 应用程序 作为我的 Google 控制台配置时,结果返回 OK

希望对你有帮助。

【讨论】:

你在哪里找到这个??我在 GCP 控制台中到处查看 @MatveyRybakov 当您选择 Android 作为您的应用程序类型时,您还需要在您的应用程序包中提供您的调试和发布签名证书指纹,这正是我所做的。但是将 应用程序类型 更改为 Web 应用程序让我很开心。您是否使用 Web 应用程序作为您的应用程序类型?您是否查看过我在 cmets 中提到的说明链接?这是你应该做的确切的方式来使它工作。 @MatveyRybakov 我正在使用 firebase 进行消息传递和应用索引编制,但对于 Google 登录,我目前使用的是 com.google.android.gms:play-services-auth:11.8.0 @MatveyRybakov 不,我没有,但请确保您的 client_id 与您的服务器相同。如果有任何帮助,我的 client_type 是 3。 @Sdghasemi 我解决了这个问题(原来我使用了错误的 oauth id)。感谢您的帮助!【参考方案2】:

我正在使用 Flutter 开发 Android 应用程序,尝试集成 Google Sign In,但遇到了 ApiException: 16SIGN_IN_FAILED(而不是 RESULT_CANCELED)的相同问题。

Firebase 上的应用程序类型设置为 android。

在我的例子中,经过数小时的调试,结果证明这是一个错误的SHA-1 问题

我从项目中提取 SHA-1 密钥并更新 Firebase 控制台后,它就可以工作了。

【讨论】:

【参考方案3】:

遇到了同样的问题,原来我没有在 firebase 项目设置上设置 support mail

如果是这种情况,firebase 会在尝试启用 Google 登录时显示编辑项目设置 > 关于 Firebase 身份验证。您可以从 firebase 复制您的客户 ID

【讨论】:

【参考方案4】:

对我来说,唯一可行的方法是提供 2 个 oauth 客户端 ID。一个 Web 应用程序客户端 ID 和一个 android 客户端 ID

在我的 android 应用程序中,我使用 Web 应用程序的客户端 ID 和客户端密码。即使我没有在我的应用程序的任何地方使用 android 客户端 ID,它仍然是必需的。即,如果我在 google api 控制台中删除了 oauth android 客户端,即使我在我的应用程序中的任何地方都没有使用该客户端 ID,我的应用程序也会停止工作。

这对我来说完全没有意义!去搞清楚 。但到目前为止,这是唯一有效的方法。

令人难以置信的。

【讨论】:

【参考方案5】:

在这里聚会可能有点晚了,但经过 4 个多小时的调试后,我意识到:

1.- 在 OAuth 客户端 ID 列表下添加一个带有您的签名证书指纹的 Android 客户端。这是强制性的。

2.- 在您的代码中添加 Web 应用程序客户端 ID,以防您需要获取 id 令牌

// ID and basic profile are included in DEFAULT_SIGN_IN
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                            .requestIdToken("YOUR_CLIENT_ID")
                            .requestEmail()
                            .build();

希望对你有帮助

【讨论】:

【参考方案6】:

我使用了从下载项目设置中找到的不同的 oauth id 密钥,并在项目中添加了客户端 3 密钥。

【讨论】:

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