关于GetGoogleIdOption无可用谷歌账户检测、setFilterByAuthorizedAccounts设置及异常处理的Java/Kotlin技术求助
兄弟,我来帮你把这几个问题理清楚,踩过类似的坑,给你一步步拆解:
1. 怎么设置setFilterByAuthorizedAccounts(false)?
这个其实超简单,直接在GetGoogleIdOption.Builder里把参数改成false就行,Java和Kotlin的写法都很直观:
Java代码示例:
GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder() .setServerClientId(getString(R.string.default_web_client_id)) .setFilterByAuthorizedAccounts(false) // 直接替换为false即可 .build();
Kotlin代码示例:
val googleIdOption = GetGoogleIdOption.Builder() .setServerClientId(getString(R.string.default_web_client_id)) .setFilterByAuthorizedAccounts(false) .build()
2. 为什么你的NoCredentialException捕获会报错?
你之前的写法错在了异常抛出的时机:GetGoogleIdOption.Builder.build()根本不会抛出NoCredentialException!这个异常是在调用CredentialManager.getCredential()方法、尝试获取用户凭证但没有可用账户的时候才会触发的。
正确的异常处理应该放在实际请求凭证的代码块里,给你举个完整的Java示例:
CredentialManager credentialManager = CredentialManager.create(this); GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder() .setServerClientId(getString(R.string.default_web_client_id)) .setFilterByAuthorizedAccounts(true) // 这里保持true,只查找已授权账户 .build(); // 构建凭证请求参数 GetCredentialRequest request = new GetCredentialRequest.Builder() .addCredentialOption(googleIdOption) .build(); // 异步请求凭证,这里才是异常抛出的正确位置 credentialManager.getCredentialAsync(this, request, ContextCompat.getMainExecutor(this), new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() { @Override public void onResult(GetCredentialResponse result) { // 获取到凭证后的处理逻辑 GoogleIdCredential credential = result.getCredential(); // ... 后续业务操作 } @Override public void onError(GetCredentialException e) { // 在这里处理异常! if (e instanceof NoCredentialException) { // 没有找到已授权的谷歌账户,可在此切换到setFilterByAuthorizedAccounts(false)的逻辑 // 或者引导用户添加/登录谷歌账户 Toast.makeText(MainActivity.this, "没有可用的谷歌账户,请先登录", Toast.LENGTH_SHORT).show(); } else { // 处理其他类型的凭证异常 e.printStackTrace(); } } });
3. 无谷歌账户场景的处理逻辑
- 如果
setFilterByAuthorizedAccounts(true):只会查找用户已经授权过你应用的谷歌账户,没有符合条件的账户时就会触发NoCredentialException,你可以在异常回调里提示用户登录,或者切换到false的选项重新发起请求。 - 如果
setFilterByAuthorizedAccounts(false):不管用户有没有授权过你的应用,都会弹出账户选择界面(包含“添加账户”的选项),用户可以直接选择新账户或未授权账户完成授权流程。
根据你的需求,要是想直接覆盖“无账户”的场景,直接把参数设为false就能让用户直接添加账户,不需要额外的异常捕获;如果必须先检查已授权账户再处理无账户情况,就用上面的异常回调逻辑即可。
内容来源于stack exchange
相关产品推荐
相关产品推荐

