8

我尝试了解如何在我的 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()
        }

    }

}

我按照这个指南。做了项目的配置。如果有关系,我会为此使用 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)
4

6 回答 6

7

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

希望能帮助到你。

于 2018-09-19T14:38:43.507 回答
4

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

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

就我而言,经过数小时的调试,结果证明是错误的SHA-1 问题

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

于 2019-07-21T17:57:50.093 回答
1

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

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

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

令人难以置信的。

于 2019-06-24T07:09:40.370 回答
1

遇到了同样的问题,原来我没有在firebase project settings上设置支持邮件

如果是这种情况,当尝试在Firebase Authentication上启用Google 登录时, firebase会显示编辑项目设置。您可以从 firebase 复制您的客户 ID

于 2019-05-21T10:40:04.140 回答
0

在这里聚会可能有点晚了,但经过 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();

希望能帮助到你

于 2019-04-26T22:52:20.680 回答
0

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

于 2019-10-02T08:03:35.697 回答