You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Sign In取消登录触发ApiException 12501致应用崩溃求助

解决Google Sign In返回键关闭弹窗时的崩溃问题

嘿,我来帮你搞定这个问题!你遇到的崩溃核心原因很明确:task.result抛出的是RuntimeExecutionException,但你的catch块只捕获了ApiException,所以这个未被捕获的RuntimeExecutionException直接导致应用崩溃,根本没走到Toast提示的逻辑里。

为什么会这样?

当你点击返回键关闭Google登录弹窗时,GoogleSignIn.getSignedInAccountFromIntent(data)返回的task其实是失败状态。这时候调用task.result会抛出RuntimeExecutionException,而这个异常的内部包裹着ApiException(12501)——这个错误码的意思就是“用户取消了登录操作”。你的代码只抓了ApiException,但外层的RuntimeExecutionException没被处理,自然就崩溃了。

两种修复方案任你选

方案一:捕获RuntimeExecutionException并处理内部异常

修改你的onActivityResult代码,先抓外层的RuntimeExecutionException,再取出里面的ApiException做针对性处理:

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: RuntimeExecutionException) {
            // 取出内部的ApiException
            val apiException = e.cause as? ApiException
            when(apiException?.statusCode) {
                12501 -> Toast.makeText(this, "登录已取消", Toast.LENGTH_SHORT).show()
                else -> Toast.makeText(this, "Google登录失败", Toast.LENGTH_SHORT).show()
            }
            // 别忘了隐藏进度条
            signin_progressbar.visibility = View.GONE
        } catch (e: ApiException) {
            Toast.makeText(this, "Google登录失败", Toast.LENGTH_SHORT).show()
            signin_progressbar.visibility = View.GONE
        }
    }
}

方案二:先检查task是否成功(更推荐)

这种方式从根源避免了异常抛出,代码更安全也更易读:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == RC_SIGN_IN) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        if (task.isSuccessful) {
            val account = task.result
            firebaseAuthWithGoogle(account)
        } else {
            val exception = task.exception as? ApiException
            when(exception?.statusCode) {
                12501 -> Toast.makeText(this, "登录已取消", Toast.LENGTH_SHORT).show()
                else -> Toast.makeText(this, "Google登录失败", Toast.LENGTH_SHORT).show()
            }
            signin_progressbar.visibility = View.GONE
        }
    }
}

额外提醒

  • 错误码12501对应GoogleSignInStatusCodes.SIGN_IN_CANCELLED,属于用户主动操作,你也可以选择不弹出Toast,避免打扰用户。
  • 不管成功还是失败,记得把进度条隐藏起来,不然用户取消登录后进度条会一直转,体验不好。

内容的提问来源于stack exchange,提问作者Daniele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:25:43