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

安卓应用Google登录10错误与Facebook登录跳转异常技术求助

安卓社交登录异常问题排查与修复建议

咱们逐个分析你遇到的两个社交登录问题,结合你提供的LoginActivity代码给出具体的排查方向和修复方案:

Google登录:完成操作后返回登录页并提示Google 10错误

Google 10错误(对应GoogleSignInStatusCodes.SIGN_IN_FAILED)绝大多数是客户端ID配置不匹配导致的,结合你的代码细节,你可以按以下步骤排查:

  • 确认server_client_id的类型:你代码里用requestIdToken(getString(R.string.server_client_id)),这里的ID必须是Google Cloud控制台中创建的Web应用客户端ID,而不是Android客户端ID。因为requestIdToken是用来向Google服务器验证身份的,需要对应服务器端的凭证。
  • 检查SHA-1指纹与包名配置:在Google Cloud控制台的OAuth 2.0客户端ID页面,确保你添加了当前应用的Debug和Release环境的SHA-1指纹,并且应用的包名和控制台里注册的完全一致(大小写也要匹配)。
  • 打印更详细的错误状态码:你的handleSignInResult方法里只打印了异常消息,建议补充打印状态码,能更精准定位问题。修改代码如下:
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
    try {
        GoogleSignInAccount account = completedTask.getResult(ApiException.class);
        Log.d("GoogleLogin", "登录成功: " + account.getId() + ", 邮箱: " + account.getEmail());
        new LoginPresenter(ThreadExecutor.getInstance(), MainThreadImpl.getInstance(), LoginActivity.this)
                .validSocialLogin(account.getId(), account.getDisplayName(), account.getEmail());
    } catch (ApiException e) {
        int statusCode = e.getStatusCode();
        Log.d("Google登录错误", "状态码: " + statusCode + ", 消息: " + e.getMessage());
        String errorMsg = switch(statusCode) {
            case GoogleSignInStatusCodes.SIGN_IN_FAILED -> "登录失败,请检查客户端ID配置";
            case GoogleSignInStatusCodes.INTERNAL_ERROR -> "内部错误,请稍后重试";
            case GoogleSignInStatusCodes.INVALID_ACCOUNT -> "无效的账号,请检查账号状态";
            default -> e.getMessage();
        };
        CustomToast.showToast(LoginActivity.this, errorMsg, R.color.colorDanger);
    }
}
  • 验证客户端ID字符串正确性:检查strings.xml里的server_client_id是否和控制台里的Web客户端ID完全一致,有没有多余的空格或拼写错误。

Facebook登录:验证后无提示返回登录页

这个问题看起来是登录流程走到了客户端成功回调,但服务器验证失败或者跳转逻辑没触发,你可以按以下方向排查:

  • 检查Facebook开发者后台配置:
    • 确认应用的包名、LoginActivity的完整类名(比如com.yourpackage.LoginActivity)已经正确填写。
    • 确认添加了当前应用的SHA-1指纹(Debug和Release都要加),Facebook对这个配置的要求很严格,不匹配会导致登录后无法正常回调。
  • 添加日志定位执行流程:你的代码里没有足够的日志,无法确认是获取用户信息失败,还是服务器接口返回异常。修改Facebook登录的onSuccess方法,添加关键节点的日志:
@Override
public void onSuccess(LoginResult loginResult) {
    Log.d("FacebookLogin", "登录凭证获取成功,Token: " + loginResult.getAccessToken().getToken());
    GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
        @Override
        public void onCompleted(JSONObject json, GraphResponse response) {
            if (response.getError() != null) {
                Log.e("FacebookGraph错误", response.getError().getErrorMessage());
                CustomToast.showToast(LoginActivity.this, "获取用户信息失败: " + response.getError().getErrorMessage(), R.color.colorDanger);
                return;
            }
            Log.d("FacebookGraph成功", "用户信息: " + json.toString());
            String userId = json.optString("id");
            String name = json.optString("name");
            String email = json.optString("email");
            Log.d("FacebookLogin", "准备调用服务器验证,用户ID: " + userId + ", 邮箱: " + email);
            new LoginPresenter(ThreadExecutor.getInstance(), MainThreadImpl.getInstance(), LoginActivity.this)
                    .validSocialLogin(userId, name, email);
        }
    });
    Bundle parameters = new Bundle();
    parameters.putString("fields", "id,name,email,gender,birthday");
    request.setParameters(parameters);
    request.executeAsync();
}
  • 排查服务器验证逻辑:如果日志显示已经调用了validSocialLogin,那问题大概率在服务器端——服务器返回的AuthResponse中user为null,导致触发setLoginResponse里的else分支,虽然显示了Toast,但可能因为页面刷新太快被覆盖,或者Toast提示不明显。你可以在setLoginResponse里添加日志,确认服务器返回的内容:
@Override
public void setLoginResponse(AuthResponse authResponse) {
    Log.d("LoginResponse", "服务器返回: " + authResponse.toString());
    if (authResponse.getUser() != null){
        UserPrefs userPrefs = new UserPrefs(getApplicationContext());
        userPrefs.setAuthPreferenceObject(authResponse, "auth_response");
        Intent returnIntent = new Intent();
        setResult(Activity.RESULT_OK, returnIntent);
        finish();
    } else {
        Log.d("LoginResponse", "用户信息为空,错误消息: " + authResponse.getMessage());
        CustomToast.showToast(LoginActivity.this, authResponse.getMessage(), R.color.colorDanger);
    }
}
  • 移除不必要的登出操作:你在fb按钮的点击事件里先调用了LoginManager.getInstance().logOut();,这会强制登出当前Facebook账号,可能导致登录流程出现状态异常。可以先注释掉这一行,测试是否能正常登录。

通用排查建议

不管是Google还是Facebook登录,都建议先确认:

  1. 应用的网络权限是否开启(android.permission.INTERNET)。
  2. 测试设备的系统时间是否正确,时间偏差过大可能导致OAuth验证失败。
  3. 用Debug模式运行,查看Logcat里的详细日志,定位具体的失败节点。

内容的提问来源于stack exchange,提问作者Lin Naing Oo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:49:11