Android - Google登录getDisplayName()在新帐户添加时为我提供电子邮件而不是显示名称

时间:2016-11-29 10:24:07

标签: android google-oauth google-signin google-account

我正在尝试将Google Sign-in集成到我的Android应用中。

这是我的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PrefUtil.setTaskBarColored(this, R.color.treasure_black);
    setContentView(R.layout.activity_login);
    ButterKnife.bind(this);
    loginHandler = new LoginHandler(this);
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .requestProfile()
            .build();

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .addApi(AppIndex.API).build();
}
@OnClick(R.id.btn_login)
    public void OnLoginButtonClick() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        startActivityForResult(signInIntent, RC_SIGN_IN);
        DialogClass.showDialog(this, "Signing In");
    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        handleSignInResult(result);

    } else {
        DialogClass.dismissDialog(this);
    }
}

private void handleSignInResult(GoogleSignInResult result) {

    if (result.isSuccess()) {
        GoogleSignInAccount acct = result.getSignInAccount();


        userName = acct.getDisplayName();
        Log.i("userName",userName);
        email = acct.getEmail();
        Uri url=null;
        if(acct.getPhotoUrl()!=null){
            url = acct.getPhotoUrl();

        }
        String imageUrl=null;
        if(url!=null && (!TextUtils.isEmpty(url.toString()))){
            imageUrl=url.toString();
            PrefUtil.putString(Constant.PreferenceKey.USER_IMAGE,imageUrl);

        }
        LoginRequestModel loginRequestModel = new LoginRequestModel(email, userName, imageUrl);
        loginHandler.getUserDetails(loginRequestModel);
        signOut();

    } else {
        DialogClass.dismissDialog(this);
    }
}

现在,当我尝试登录我的应用时,如果我在AccountChooser对话框中选择使用预先配置的帐户,则效果非常好。

但是,如果在AccountChooser对话框中,我使用Account Chooser“添加帐户”选项并添加新帐户,则会向我发送电子邮件userName = acct.getDisplayName()代替用户名称,并在url = acct.getPhotoUrl()

中为null

但是,如果我通过帐户选择器选择同一帐户注销我的应用并使用相同的帐户,那么它运作正常,我无法找出原因。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

在GoogleSignInOptions中添加requestIdToken('您的服务器客户端ID')之后,我也遇到了同样的问题,现在我在添加新帐户时获取所有数据,而google登录后面是更新了GoogleSignInOptions代码,将您的服务器客户端ID替换为您的Google项目Outh客户端ID,然后您将获得正确的数据。

GoogleSignInOptions gso = new       GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .requestProfile()
                .requestIdToken('Your server client id')
                .build(); 

另请参阅此Google Signin returns display name as null only when Add account in the flow

感谢。