Прежде всего позвольте мне сказать, что нет необходимости понижать файлы 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()
метод на данный момент подписан в пользователя должно быть достаточно, чтобы показать их имя пользователя.
В противном случае, если ваше приложение позволяет пользователю войти в систему, используя созданный им адрес электронной почты/пароль, убедитесь, что вы получили свое имя/имя пользователя при регистрации, чтобы впоследствии использовать его для его отображения.
Спасибо! getProviderData() возвращает мне 2 информации о пользователях, поэтому я могу выбрать информацию google.com, но все же странно, что если я свяжу нового пользователя, он должен показать мне только нового пользователя, а не того и другого ... но все еще работает;) –
Yea я заметил пару странных вещей в firebase ..... например, например, в iOS анонимный ключ возвращает anonymous = true с пользовательской аутентификацией и с анонимной аутентификацией, в то время как в android custom = false и anonymous = true – Ymmanuel