android - Google 登录 - 关闭登录对话框时出现 ApiException 12501

标签 android kotlin google-signin

我已经成功实现了 Google 登录,它工作正常,当我实际完成整个登录过程时,我没有遇到任何异常。

但是如果我点击 Google 登录按钮然后点击后退按钮关闭对话框,我会以某种方式收到以下错误:

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)

这让我想到了这段代码:

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()
            }
        }

特别是在 val account = task.result 行。

我的问题是,它不应该通过 catch 自己处理并打印出 toast 吗?为什么整个应用程序崩溃了?

这是我的整个 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    }
}

最佳答案

你能试试这个吗,让我知道会发生什么:

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());
        }
    }

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

此外,如果您还可以上传您在 SignIn Activity 中编写的完整代码以及 google-services.json 文件,这样我就可以调试问题,那就太好了。

编辑 添加这个

if (resultCode == Activity.RESULT_OK)

requestCode == RC_SIGN_IN 之后

关于android - Google 登录 - 关闭登录对话框时出现 ApiException 12501,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50447430/

相关文章:

Android Firebase 身份验证 : federated Google login not working in Oreo

android - 有人成功地将 live555 移植到 android 吗?

android - react native 选择器样式自定义字体

kotlin - 如何在Java中使用okhttp实现scarlet websocket库?

android - mapping.MapView 无法转换为 mapping.SupportMapFragment

javascript - GoogleUser.signIn 不是函数

android - 闪屏上的沉浸式模式

android - 为什么我的应用会请求我没有请求的权限?

Kotlin:IllegalAccessException:类 BlockJUnit4ClassRunner 无法使用修饰符 “private” 访问类 Foo 的成员

javascript - 使用 angularjs 使用 Google 登录(gapi)时出现问题