匿名链接谷歌帐户时没有获得用户的名字

时间:2017-11-15 07:44:32

标签: android firebase-authentication anonymous

我有双向登录方式,一种是正常 Google登录,另一种是匿名登录。在我的谷歌登录没有问题,一切正常,即使用户的凭据也很好,包括姓名,电子邮件和firebase ID。 现在的问题是,当我使用firebase将我的匿名帐户链接到google id时,它也正常工作,但在获取凭据时,我收到的所有内容在调用 getDisplayName()时为空。

注意:我正在获取firebase ID并正确发送电子邮件,但名称无效。

这是我的日志输出:

11-15 12:58:26.712 21983-21983/in.pinelane.myhovi E/userName: null
11-15 12:58:26.712 21983-21983/in.pinelane.myhovi E/userEmail: xyz@gmail.com

由于我的代码工作正常但仍然没有运气,代码如下:

private void linkGuestWithCredential(AuthCredential credentials) {

    firebaseAuth.getCurrentUser().linkWithCredential(credentials)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if( task.isSuccessful()){
                        mProgress.dismiss();
                        Log.d(TAG, "linkWithCredential:success");

                        FirebaseUser permanentUser = task.getResult().getUser();
                        callAnonymousUpdateApi(permanentUser);

                        Intent signIntent = new Intent(LoginActivity.this, MainActivity.class);
                        signIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(signIntent);
                        Toast.makeText(LoginActivity.this, "Welcome to MyHovi!", Toast.LENGTH_LONG)
                                .show();
                        finish();
                        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);

                    }else{
                        mProgress.dismiss();
                        Log.e(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(getApplicationContext(), "Sign-in failed", Toast.LENGTH_SHORT)
                                .show();
                    }
                }
            });

callAnonymousUpdateApi(permanentUSer)中,我实际上是在获取凭据:

private void callAnonymousUpdateApi(FirebaseUser permanentUser) {

    final String name = permanentUser.getDisplayName();
    final String email = permanentUser.getEmail();
    final String firebaseId = permanentUser.getUid();

    RequestParams params = new RequestParams();
    params.add("user_id", userId);
    params.add("name", name);
    params.add("email", email);
    params.add("firebase_id", firebaseId);
    params.add("user_complete", "true");
}

到目前为止我尝试的是:

  1. FirebseUser permanentUSer = task.getResult().getUser();更改为FirebseUser permanentUSer = FirebaseAuth.getInstance().getCurrentUser();

  2. 在callAnonymousUpdateApi(FirebaseUser permanentUser)中以不同的方式尝试了同样的事情我所做的就是尝试将名称设为final String name = FirebaseAuth.getInstance().getCurrentUser().getDisplayName();

  3. 但仍然没有运气,任何帮助都将受到高度赞赏。感谢

2 个答案:

答案 0 :(得分:2)

链接提供者时,提供者的displayName和photoURL不会自动复制到顶级。您可以在链接到匿名用户时简单地复制这些字段。您可以获取Google displayName:

FirebaseAuth.getInstance().getCurrentUser().getProviderData(‌​).get(0).getDisplayName()

然后你会更新档案:

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder().setDisplayName(displayName).build();
user.updateProfile(profileUpdates)
   .addOnCompleteListener(new OnCompleteListener<Void>() {
     @Override
     public void onComplete(@NonNull Task<Void> task) {
       if (task.isSuccessful()) {
         Log.d(TAG, "User profile updated.");
       }
     }
   }
});

答案 1 :(得分:0)

我知道这是一个老问题,但只是为有相同问题的人提供答案:

Bojeil的回答:FirebaseAuth.getInstance().getCurrentUser().getProviderData(‌).get(0).getDisplayName()是正确的!但是,他正在使用getDisplayName()为第一个提供程序获取get(0),您需要做的是检查所需的提供程序ID,并混合其显示名称,否则将抛出一个更简单的解决方案他们所有人都像这样检查getDisplayName() != null

String displayName = "";
for (UserInfo userInfo : firebaseAuth.getCurrentUser().getProviderData()) {
    if (userInfo.getDisplayName() != null) {
        displayName = userInfo.getDisplayName();
        break;
    }
}

有关更多详细信息,请参考此document