2016-06-06 3 views
9

Когда я вхожу в мою учетную запись google и получаю имя с помощью getDisplayName(), мое имя отображается правильно, но в AuthStateListener этого нет.firebaseAuth.getCurrentUser() return null DisplayName

здесь часть моего кода:

private void handleSignInResult(GoogleSignInResult result) { 

    Alert.dismissProgress(); 

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

     if(acct != null) { 
      Log.i("NAME", acct.getDisplayName()); <-- RETURN MY NAME CORRECTLY 
      credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
      fuser.linkWithCredential(credential).addOnCompleteListener(authResult);      
     } else { 
      //ERROR 
     } 

    } else { 
     //ERROR 
    } 
} 

Но в моем AuthStateListener

@Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
     FirebaseUser nuser = firebaseAuth.getCurrentUser(); 

     if (nuser != null) { 

      Log.i("NAME", nuser.getDisplayName()); <--- RETURN NULL 
     } 
    } 

Somebody знаю, почему это может произойти?

ответ

6

Это сложный один, так как это не так ясно, в документации ...

Проверьте getProviderData()

, как определено здесь: https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser#public-method-summary

Вы можете перебирать этот список и он будет иметь всех поставщиков, связанных с этой учетной записью, включая поставщика с провайдером-провайдером = «google.com» с отображением Name = YOUR_GOOGLE_USERNAME

сообщите мне, если вы не можете заставить его работать

+0

Спасибо! getProviderData() возвращает мне 2 информации о пользователях, поэтому я могу выбрать информацию google.com, но все же странно, что если я свяжу нового пользователя, он должен показать мне только нового пользователя, а не того и другого ... но все еще работает;) –

+0

Yea я заметил пару странных вещей в firebase ..... например, например, в iOS анонимный ключ возвращает anonymous = true с пользовательской аутентификацией и с анонимной аутентификацией, в то время как в android custom = false и anonymous = true – Ymmanuel

6

Просто чтобы добавить ответ Ymmanuel в (Спасибо!) с некоторыми примерами кода для тех, кто еще ищет для быстрого копирования и вставки:

FirebaseUser user = firebaseAuth.getCurrentUser(); 
if (user != null) { 
    // User is signed in    
    String displayName = user.getDisplayName(); 
    Uri profileUri = user.getPhotoUrl(); 

    // If the above were null, iterate the provider data 
    // and set with the first non null data 
    for (UserInfo userInfo : user.getProviderData()) { 
     if (displayName == null && userInfo.getDisplayName() != null) { 
      displayName = userInfo.getDisplayName(); 
     } 
     if (profileUri == null && userInfo.getPhotoUrl() != null) { 
      profileUri = userInfo.getPhotoUrl(); 
     } 
    } 

    accountNameTextView.setText(displayName); 
    emailTextView.setText(user.getEmail()); 
    if (profileUri != null) { 
     Glide.with(this) 
       .load(profileUri) 
       .fitCenter() 
       .into(userProfilePicture); 
    } 
} 

выше будет пытаться использовать имя дисплея и URL-адрес фотографии от поставщиков, если он не был первоначально найден в объекте User.

Бонус: Использование планера для изображений: https://github.com/bumptech/glide.

0

Я получаю эту проблему, когда у меня было:

compile 'com.google.firebase:firebase-auth:10.0.0' 
compile 'com.firebaseui:firebase-ui-auth:1.0.1' 

Обходной что установил ее для меня было заменить это:

compile 'com.google.firebase:firebase-auth:9.6.0' 
compile 'com.firebaseui:firebase-ui-auth:0.6.0' 

переборе user.getProviderData() как предложено в другом месте не исправьте его для более поздних версий.

3

Эдмунд Джонсон прав. Эта проблема была введена в Firebase Auth 9.8.0. Обходной путь включает в себя понижение до 9.6.1 или принуждение к повторному входу в систему, когда информация заполняется после выхода пользователя из системы и входа в систему. Проблема описана в Firebase issue

Сообщается, что это ошибка для Firebase одним из участников Firebase UI - Алексом Савау.

1

Я была такая же проблема, я ее решил, подписавшись из пользователя и отставки их обратно.

вызов FirebaseAuth.getInstance().signOut(); подписать их, а затем повторите попытку. Как я выяснил, эта проблема распространена с использованием аутентификации по электронной почте и паролю и социального входа (Facebook в моем случае) одновременно.

0

Прежде всего позвольте мне сказать, что нет необходимости понижать файлы Gradle или выходить из системы и вводить пользователя в систему несколько раз, как указано другими, только для отображения имени пользователя. Я решил проблему по-другому, сохраняя при этом последние файлы Gradle, и не нужно регистрировать пользователя и несколько раз. Проблема с getDisplayName() - очень большая, поэтому я хочу быть настолько описательной, насколько это возможно для будущих пользователей Firebase, чтобы избавить их от головной боли.

Вот детали решения:

Решение 1:

Для пользователей, которые проходят проверку подлинности (входа в) с несколькими поставщиками, такими как Facebook, Google и т.д., и/или по электронной почте/Пароль, который вы создали при регистрации:

Первое, что вы хотите убедиться в том, что когда вы впервые зарегистрируетесь с помощью приложения, вы храните свое имя в базе данных под их уникальным Я бы. Что может выглядеть примерно так:

// Method signature. Write current user's data to database 
private void writeNewUser(String userId, String name, String email) { 

DatabaseReference current_user_database = mDatabaseRef.child(userId); 

current_user_database.child("username").setValue(name); 

// Email here is not mandatory for the solution. Just here for clarity of the 
// method signature 
current_user_database.child("email").setValue(email); 

} 

После имени пользователя хранился в базе данных Firebase, и вы должны их подписать в приложение вы можете получить их имя пользователя что-то вроде этого:

// Method that displays the user's username 
    private void showUserName() { 

     // Get instance of the current user signed-in 
     mFirebaseUser = mAuth.getCurrentUser(); 

     // Check if user using sign-in provider account is currently signed in 
     if (mFirebaseUser != null) { 


      // Get the profile information retrieved from the sign-in provider(s) linked to a user 
      for (UserInfo profile : mFirebaseUser.getProviderData()) { 

        // Name of the provider service the user signed in with (Facebook, Google, Twitter, Firebase, etc.) 
        String name = profile.getDisplayName(); 


// If displayName() is null this means that the user signed in using the email and password they created. This is the null issue we shouldn't get that we are gonna be solving below. 
       if(name == null){ 

        mDatabaseRef.addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 

// Get the name the user signed-up with using dataSnapshot 
          String nameOfCurrentUser = (String) dataSnapshot.child("name").getValue(); 

// Set username we retrieved using dataSnapshot to the view 
          mTestUsernameTextView.setTitle(nameOfCurrentUser); 

         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 

// If the name is not null that means the user signed in with a social Auth provider such as Facebook, Twitter, Google etc. 
       if(name != null) { 

        // Set the TextView (or whatever view you use) to the user's name. 
        mTestUsernameTextView.setText(name); 

       } 

      } // End for 

     } // End if 

    } 

Это Это. Теперь вы просто называете этот метод showUserName() или каким бы то ни было, ваш метод будет вызван внутри вашего onCreate и, надеюсь, это поможет.

Решение 2:

Для пользователей, которые зарегистрируются в приложение, используя только социальные поставщика услуг средств массовой информации, таких как Facebook, Twitter, Google или любой другой вариант Firebase позволяет:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
if (user != null) { 
    for (UserInfo profile : user.getProviderData()) { 
     // Id of the provider (ex: google.com) 
     String providerId = profile.getProviderId(); 

     // UID specific to the provider 
     String uid = profile.getUid(); 

     // Name, email address, and profile photo Url 
     String name = profile.getDisplayName(); 
     String email = profile.getEmail(); 
     Uri photoUrl = profile.getPhotoUrl(); 
    }; 
} 

Это решение для решения 2, просто следуйте инструкциям по Firebase, и вы должны быть хорошими.

Вот ссылка на него, если вам интересно: Get a user's profile information

Я действительно надеюсь, что это помогает любому борется с getDisplayName() вопросом.

Вывод:

Если ваше приложение имеет только Facebook, Twitter, Google или любой другой знак в социальных сетях, Firebase обеспечивает то просто вызывая getDisplayName() метод на данный момент подписан в пользователя должно быть достаточно, чтобы показать их имя пользователя.

В противном случае, если ваше приложение позволяет пользователю войти в систему, используя созданный им адрес электронной почты/пароль, убедитесь, что вы получили свое имя/имя пользователя при регистрации, чтобы впоследствии использовать его для его отображения.

0

Я нашел решение этой проблемы, в Firebase documentation! Решение обновить профиль пользователя с помощью: UserProfileChangeRequest:

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() 
         .setDisplayName(mUser.getName()) 
         .setPhotoUri(Uri.parse("https://example.com/mario-h-user/profile.jpg")) 
         .build(); 

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

Переменная Muser уже заполнена с содержанием от полей. я использовал этот кусок кода внутри FirebaseAuth.AuthStateListener() -> onAuthStateChanged()

0

Эта проблема решена в последней verison из firebase Ui компиляции «com.firebaseui: firebase-интерфейса: 1.2.0 '