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

Android-Google登录getDisplayName(),在新帐户添加时为我提供电子邮件而不是显示名称,android,google-oauth,google-signin,google-account,Android,Google Oauth,Google Signin,Google Account,我正在尝试将谷歌登录集成到我的android应用程序中 这是我的密码: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PrefUtil.setTaskBarColored(this, R.color.treasure_black); setContentView(R.layout.activity_login);

我正在尝试将
谷歌登录
集成到我的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
对话框中,我使用
AccountChooser
“添加帐户”选项并添加一个新帐户,它会在
userName=acct.getDisplayName()
中向我发送电子邮件,而不是用户名,在
url=acct.getPhotoUrl()

但是,如果我注销我的应用程序并通过account chooser选择同一个帐户来使用同一个帐户,那么它工作得非常完美,我也不知道为什么


任何帮助都将不胜感激。

我也遇到了同样的问题,在谷歌登录选项中添加requestIdToken(“您的服务器客户端id”)后,现在我在添加新帐户时获得了所有数据,而谷歌登录下面是更新后的谷歌登录选项代码,将您的服务器客户端id替换为您的google Project Outh客户端id,然后您将获得正确的数据

GoogleSignInOptions gso = new       GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .requestProfile()
                .requestIdToken('Your server client id')
                .build(); 
也请参考本手册


谢谢。

你解决了这个问题吗?或者为什么会这样?在这方面运气不好。我所做的是检查我是否从Google获得了姓名或电子邮件,如果我收到了电子邮件,请再次打开帐户选择器。这是为了防止您使用后端服务器进行身份验证。