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

Android中使用CredentialManager实现Google登录失败及获取accessToken、email问题

解决CredentialManager无法唤起Google登录及获取accessToken/邮箱的问题

一、修复无法唤起登录界面的核心问题

你的代码存在几个关键错误导致登录界面无法唤起:

  • GetCredentialRequest构建逻辑错误:使用credentialRequest.getData()初始化Builder是无效操作,需从空Builder开始构建请求。
  • CredentialOption配置错误:注释掉了正确的Google登录选项配置,反而使用未定义的credentialOption,导致请求不包含Google登录入口。
  • 版本判断冗余:可简化版本判断逻辑,确保请求构建流程正确。

二、获取accessToken和邮箱的必要配置

要获取用户邮箱与accessToken,需在GetGoogleIdOption中开启accessToken请求,并添加对应的权限范围。

三、修正后的完整代码

public void login(Context context) {
    CancellationSignal cancellationSignal = new CancellationSignal();
    
    // 配置Google登录选项,开启accessToken请求并添加必要权限范围
    GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
            .setFilterByAuthorizedAccounts(true)
            .setServerClientId(web_client_id)
            .requestAccessToken(true) // 开启accessToken请求
            .setScopes(List.of("email", "profile")) // 添加获取邮箱、基本信息的权限
            .build();

    // 正确构建GetCredentialRequest,添加Google登录选项
    GetCredentialRequest credentialRequest = new GetCredentialRequest.Builder()
            .addCredentialOption(googleIdOption)
            .build();

    // 调用CredentialManager获取凭证
    credentialManager.getCredential(context,
            credentialRequest,
            cancellationSignal,
            Executors.newSingleThreadExecutor(),
            new OutcomeReceiver<GetCredentialResponse, GetCredentialException>() {
                @Override
                public void onResult(GetCredentialResponse result) {
                    handleSignIn(result);
                }

                @Override
                public void onError(GetCredentialException exception) {
                    // 处理错误场景,如无可用账号、用户取消登录等
                    Log.e("LoginError", exception.getMessage());
                }
            }
    );
}

public void handleSignIn(GetCredentialResponse result) {
    Credential credential = result.getCredential();
    // 将通用凭证转换为GoogleIdCredential,获取详细信息
    if (credential instanceof GoogleIdCredential googleIdCredential) {
        String email = googleIdCredential.getId(); // 获取用户邮箱
        String accessToken = googleIdCredential.getAccessToken(); // 获取accessToken
        String displayName = googleIdCredential.getDisplayName(); // 获取用户名
        String profilePicUri = googleIdCredential.getProfilePictureUri(); // 获取头像地址

        Log.e("LoginInfo", "邮箱: " + email);
        Log.e("LoginInfo", "Access Token: " + accessToken);
        Log.e("LoginInfo", "用户名: " + displayName);
    }
}

四、额外注意事项

  • Server Client ID验证:确保web_client_id是Google Cloud Console中创建的Web应用类型Client ID,而非Android应用的Client ID。
  • 权限配置:在AndroidManifest.xml中添加网络权限:<uses-permission android:name="android.permission.INTERNET" />。
  • 错误细化处理:在onError中区分不同异常类型(如NoCredentialException、UserCanceledException),便于排查具体问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:43:20