Prima lasciatemi dire che non è necessario eseguire il downgrade dei file Gradle o il logout e accedere più volte all'utente come indicato da altri solo per visualizzare il nome utente. Ho risolto il problema in un modo diverso pur mantenendo gli ultimi file Gradle e senza dover disconnettere l'utente e in più volte. Il problema con getDisplayName()
è molto grande quindi voglio essere il più descrittivo possibile per i futuri utenti di Firebase per risparmiare loro il mal di testa.
Ecco i dettagli della soluzione:
Soluzione 1:
Per gli utenti che eseguono l'autenticazione (sign-in) con più fornitori come Facebook, Google ecc e/o e-mail/Password creata al momento della registrazione:
La prima cosa che si vuole assicurare è che quando si registra un utente con l'app per la prima volta si memorizza il proprio nome nel database sotto il loro unico id. Che può essere simile a questa:
// 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);
}
Dopo il nome dell'utente è stato memorizzato nel database Firebase e si dispone di loro firmare nella vostra applicazione è possibile ottenere il loro nome utente qualcosa di simile:
// 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
}
Ecco esso. Ora chiami quel metodo showUserName()
o qualunque sia il tuo metodo verrà chiamato all'interno del tuo onCreate e speriamo che questo aiuti.
Soluzione 2:
Per gli utenti che si iscrivono nella vostra applicazione utilizzando solo un fornitore di servizi di social media come Facebook, Twitter, Google o qualsiasi altra opzione Firebase permette:
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();
};
}
È tutto per la soluzione 2, basta seguire le linee guida su Firebase e dovresti essere bravo.
Ecco un link ad esso se siete curiosi: Get a user's profile information
Spero davvero che questo aiuta tutti coloro che lottano con il problema getDisplayName()
.
Conclusione:
Se la vostra applicazione ha solo Facebook, Twitter, Google o qualsiasi altra cosa le opzioni di accesso altro social media Firebase fornisce poi basta semplicemente chiamando getDisplayName()
metodo sul attualmente firmato a utente dovrebbe essere sufficiente a dimostrare il loro nome utente.
In caso contrario, se l'app consente all'utente di accedere utilizzando una e-mail/password creata, assicurarsi di ottenere il proprio nome/nome utente al momento dell'iscrizione in modo da poterlo utilizzare in un secondo momento per visualizzarlo.
Grazie! getProviderData() mi restituisce 2 informazioni sugli utenti, quindi posso selezionare le informazioni su google.com, ma ancora strano che se collego il nuovo utente dovrebbe mostrarmi solo il nuovo utente e non entrambi ... ma funziona ancora;) –
Sì ho notato un paio di cose strane firebase ..... come ad esempio in iOS la chiave anonima restituisce anonymous = true con autenticazione personalizzata e con autenticazione anonima mentre in android custom = false e anonymous = true – Ymmanuel