我已经成功地实现了谷歌登录,它工作得很好,当我真正完成整个登录过程时,没有例外.

但是,如果我点击谷歌登录按钮,然后点击后退按钮关闭对话框,我不知何故会出现以下错误:

Caused by: com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 12501: at com.google.android.gms.tasks.zzu.getResult(Unknown Source:17)

which points me to this piece of code:

if (requestCode == RC_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                val account = task.result
                firebaseAuthWithGoogle(account)
            } catch (e: ApiException) {
                Toast.makeText(this, "Google Sign In Failed", Toast.LENGTH_SHORT).show()
            }
        }

specifically on the val account = task.result line.

My question is, shouldn't it handle it by himself via the catch and print out the toast? Why is the whole app crashing instead?

Here is my whole SignInActivity:

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.design.widget.BottomSheetDialog
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.Toast
import com.dancam.subscriptions.ActiveSubscriptions.SubscriptionsMain
import com.dancam.subscriptions.R.id.google_signin_button
import com.dancam.subscriptions.R.id.signin_progressbar
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.SignInButton
import com.google.android.gms.common.api.ApiException
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.FirebaseUser
import com.google.firebase.auth.GoogleAuthProvider
import kotlinx.android.synthetic.main.reset_password_dialog.view.*
import kotlinx.android.synthetic.main.sign_dialog.view.*
import kotlinx.android.synthetic.main.signin.*
import org.jetbrains.anko.defaultSharedPreferences
import org.jetbrains.anko.sdk25.coroutines.onClick

class SignInActivity: AppCompatActivity() {
    private var mAuth: FirebaseAuth? = null
    private var mGoogleSignInClient: GoogleSignInClient? = null

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

        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build()

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso)
        mAuth = FirebaseAuth.getInstance()

        google_signin_button.setSize(SignInButton.SIZE_WIDE)
        google_signin_button.setOnClickListener { signIn() }
    }

    override fun onStart() {
        super.onStart()
        val currentUser = mAuth?.currentUser

        if (currentUser!=null) loggedIn(currentUser)
    }

    private fun signIn() {
        val signInIntent = mGoogleSignInClient?.signInIntent
        startActivityForResult(signInIntent, RC_SIGN_IN)
        signin_progressbar.visibility = View.VISIBLE
    }

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

        if (requestCode == RC_SIGN_IN) {
            val task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                val account = task.result
                firebaseAuthWithGoogle(account)
            } catch (e: ApiException) {
                Toast.makeText(this, "Google Sign In Failed", Toast.LENGTH_SHORT).show()
            }
        }
    }

    private fun firebaseAuthWithGoogle(acct: GoogleSignInAccount) {
        val credential = GoogleAuthProvider.getCredential(acct.idToken, null)
        mAuth?.signInWithCredential(credential)
                ?.addOnCompleteListener {
                    if (it.isSuccessful) {
                        signin_progressbar.visibility = View.GONE
                        val user = mAuth?.currentUser
                        loggedIn(user)
                    } else {
                        signin_progressbar.visibility = View.GONE
                        Toast.makeText(this, "Authentication Failed", Toast.LENGTH_SHORT).show()
                        loggedIn(null)
                    }
                }
    }

    fun onSignUpClicked(args: View) {
        val view = layoutInflater.inflate(R.layout.sign_dialog, null)
        val dialog = BottomSheetDialog(this)
        dialog.setContentView(view)
        dialog.show()

        view.register_button.setOnClickListener {
            val email = view.signup_email.text.toString()
            val password = view.signup_password.text.toString()
            val password2 = view.signup_password2.text.toString()

            if (password == password2) {
                mAuth?.createUserWithEmailAndPassword(email, password)
                        ?.addOnCompleteListener {
                            if (it.isSuccessful) {
                                //sign in success updateUI
                                val user = mAuth?.currentUser
                                loggedIn(user)
                            } else {
                                // signin failed
                                //TODO: translate
                                Toast.makeText(this, "Authentication Failed", Toast.LENGTH_SHORT).show()
                                loggedIn(null)
                            }
                        }
            } else {
                //TODO: translate
                Toast.makeText(this, "Passwords do not match", Toast.LENGTH_LONG).show()
            }
        }
    }

    fun onSignInClicked(args: View) {
        val view = layoutInflater.inflate(R.layout.sign_dialog, null)
        val dialog = BottomSheetDialog(this)

        //TODO: translate
        view.dialog_textview.text = "Sign In"
        view.signup_password2.visibility = View.GONE

        dialog.setContentView(view)
        dialog.show()

        //TODO: translate
        view.register_button.text = "Sign In"
        view.register_button.setOnClickListener {
            val email = view.signup_email.text.toString()
            val password = view.signup_password.text.toString()

            mAuth?.signInWithEmailAndPassword(email, password)
                    ?.addOnCompleteListener {
                        if (it.isSuccessful) {
                            val user = mAuth?.currentUser
                            loggedIn(user)
                        } else {
                            //TODO: translate
                            Toast.makeText(this, "Sign In Failed", Toast.LENGTH_LONG).show()
                            view.forgotten_password.visibility = View.VISIBLE

                            view.forgotten_password.onClick {
                                dialog.dismiss()
                                resetDialog()
                            }
                        }
                    }
        }
    }

    private fun resetDialog() {
        val resetView = layoutInflater.inflate(R.layout.reset_password_dialog, null)
        val resetDialog = BottomSheetDialog(this)
        resetDialog.setContentView(resetView)
        resetDialog.show()

        resetView.send_reset_email.setOnClickListener {
            resetView.send_reset_email.isClickable = false
            val email = resetView.reset_email.text.toString()
            mAuth?.sendPasswordResetEmail(email)
                    ?.addOnSuccessListener {
                        //TODO: translate
                        Toast.makeText(this, "Email Sent", Toast.LENGTH_SHORT).show()
                        resetDialog.dismiss()
                    }
        }
    }

    private fun loggedIn(user: FirebaseUser?) {
        startActivity(Intent(this, SubscriptionsMain::class.java))
        finish()
    }

    fun onSkipClicked(args:View) {
        loggedIn(null)
    }

    companion object {
        const val RC_SIGN_IN = 0000    }
}

推荐答案

Can you try this and let me know what happens:

if (requestCode == RC_SIGN_IN) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        try {
            val account = task.result(ApiException::class.java)
            firebaseAuthWithGoogle(account)
        } catch (e: ApiException) {
            Log.w("TAG", "signInResult:failed code=" + e.getStatusCode());
        }
    }

请告诉我你在记录这个时得到了什么.

此外,如果您还可以上传您在登录活动中编写的全部代码以及google-services.json文件,以便我可以调试该问题,那就太好了.

EDIT Add this

if (resultCode == Activity.RESULT_OK)

after requestCode == RC_SIGN_IN

Kotlin相关问答推荐

在KMP中使用koin将来自Android的上下文注入到SQLDelight Driver中

某些公共函数显然不能在类实例上访问;Klaxon示例

Webpack 配置未应用于 kotlin 多平台react 项目

Kotlin .如何用从 1 到 90 的 5 个唯一数字填充列表中的每一行?

Kotlin 接口类型参数

如何将 `when` 与 2 个密封类一起使用并获取内部值?

在 Kotlin 中,我可以在集合上有一个条件构建器元素吗?

kotest 更改环境变量

匹配在单词边界上包含特殊字符的变量字符串的正则表达式

是什么让 Kotlin 中的 String 类能够使用方括号?

将 Kotlin 类属性设置器作为函数引用

IntelliJ 不会根据 ktlint 的期望对 Kotlin 导入进行排序

ActivityOptions.makeSceneTransitionAnimation 在具有多个视图的 kotlin 中不起作用

如何使用Kotlin Dokka记录主构造函数参数

Kotlin get字段注释始终为空

用mockk验证属性设置程序吗?

在Kotlin中为Android编写库会有开销吗?

指定为非null的参数在ArrayAdaper中为null

Kotlin out-projected 类型禁止使用

Kotlin var lazy init