我有以下代码应该返回Firebase登录的用户数据,它返回的用户没有问题,ID和Email,但是名称的值返回空或null。好像用户已经注册时没有名字,但是在注册器中出现了用户名。有人知道为什么吗?我已经搜索了它,它似乎在Firebase getDisplayName中存在一些错误。有人有解决方案吗?
hg postreview -l
返回FirebaseAuth的实例:
public static FirebaseUser getUsuarioAtual() {
FirebaseAuth usuario = ConfiguracaoFirebase.getFirebaseAutenticacao();
return usuario.getCurrentUser();
}
public static Usuario getDadosUsuarioLogado() {
FirebaseUser firebaseUser = getUsuarioAtual();
Usuario usuario = new Usuario();
usuario.setId(firebaseUser.getUid());
usuario.setEmail(firebaseUser.getEmail());
usuario.setNome(firebaseUser.getDisplayName());
return usuario;
}
创建帐户的代码:
public static FirebaseAuth getFirebaseAutenticacao(){
if (auth == null) {
auth = FirebaseAuth.getInstance();
}
return auth;
}
更新用户名:
public void cadastrarUsuario(final Usuario usuario){
autenticacao = ConfiguracaoFirebase.getFirebaseAutenticacao();
autenticacao.createUserWithEmailAndPassword(
usuario.getEmail(),
usuario.getSenha()
).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
try {
String idUsuario = task.getResult().getUser().getUid();
usuario.setId( idUsuario );
usuario.salvar();
UsuarioFirebase.atualizarNomeUsuario(usuario.getNome());
//Redireciona o usuário com base no seu tipo
if ( verificaTipoUsuario() == "P" ) {
startActivity(new Intent(CadastroActivity.this, PassageiroActivity.class));
finish();
Toast.makeText(CadastroActivity.this, "Cadastro realizado com sucesso!", Toast.LENGTH_SHORT).show();
} else {
startActivity(new Intent(CadastroActivity.this, RequisicoesActivity.class));
finish();
Toast.makeText(CadastroActivity.this, "Parabéns! Você agora é nosso parceiro!", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
String excecao = "";
try {
throw task.getException();
} catch ( FirebaseAuthWeakPasswordException e ) {
excecao = "Digite uma senha mais forte!";
} catch ( FirebaseAuthInvalidCredentialsException e ) {
excecao = "Por favor, digite um e-mail válido";
} catch ( FirebaseAuthUserCollisionException e ) {
excecao = "Já existe uma conta com esse e-mail";
} catch ( Exception e ) {
excecao = "Erro ao cadastrar usuário: " + e.getMessage();
e.printStackTrace();
}
Toast.makeText(CadastroActivity.this, excecao, Toast.LENGTH_SHORT).show();
}
}
});
}
答案 0 :(得分:0)
要获取您的显示名称,您需要在使用电子邮件和密码创建新帐户时进行设置
例如
mAuth.createUserWithEmailAndPassword(email,pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(task.isSuccessful()){
saveUser(email,pass,name);
FirebaseUser user = mAuth.getCurrentUser();
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder().setDisplayName(name).build();
user.updateProfile(profileUpdates);
finish();
...
现在,您将需要一个AuthStateListener
,然后完成操作(成功登录或创建帐户)后,即可获得名称。由于firebase会管理此异步
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
usuario.setNome(firebaseUser.getDisplayName());
} else {
finish();
...
检查UserProfileChangeRequest Here
重要
如果您使用Google登录之类的提供商进行登录,它将自动处理您的显示名称(以及个人资料照片),而仅致电user.getDisplayName()
而不进行设置即可正确完成工作 >
请记住,当您使用emailAndPassword创建一个新帐户时,该帐户的ID和电子邮件将自动存储在Firebase中,这就是为什么您无需设置即可访问这些数据的原因。这是与用户一起创建的元数据的示例。在这种情况下,定义您的用户的元数据仅是UserID和Email。
但是从来没有为该帐户设置displayName或photoUri,这就是为什么如上所述创建新帐户时也需要设置它们的原因。
提示
避免使用自己的方法,当应用扩展时,您会感到困惑。
public static FirebaseAuth getFirebaseAutenticacao(){
if (auth == null) {
auth = FirebaseAuth.getInstance();
}
return auth;
}
相反,只需使用此
FirebaseAuth usuario = FirebaseAuth.getInstance();
然后使用您的用法来获取所需的内容
usuario.getCurrentUser().getUid(); //for example, getting the uid of the user logged in