Firebase getDisplayName()返回空

时间:2018-11-20 14:31:14

标签: android firebase firebase-realtime-database firebase-authentication

我有以下代码应该返回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();

                }

            }
        });

    }

1 个答案:

答案 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。

enter image description here

但是从来没有为该帐户设置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