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
相关产品推荐
相关产品推荐

