Firebase getDisplayName () возвращает пустой - PullRequest
0 голосов
/ 20 ноября 2018

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

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;
    }

Возвращает экземпляр FirebaseAuth:

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();

                }

            }
        });

    }

Обновление имени пользователя:

public static boolean atualizarNomeUsuario (String nome) {

        try {

            FirebaseUser user = getUsuarioAtual();
            UserProfileChangeRequest profile = new UserProfileChangeRequest.Builder()
                    .setDisplayName( nome )
                    .build();
            user.updateProfile(profile).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                    if (!task.isSuccessful()){
                        Log.d("Perfil", "Erro ao atualizar nome de perfil.");
                    }

                }
            });

            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

1 Ответ

0 голосов
/ 20 ноября 2018

Чтобы получить отображаемое имя, вам потребуется настроить его при создании новой учетной записи с адресом электронной почты и паролем

Например,

    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 Здесь

Важно

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

Помните, что при создании новой учетной записи сemailAndPassword, идентификатор учетной записи и электронная почта автоматически сохраняются в Firebase, поэтому вы можете получить доступ к этим данным без их настройки.Это пример метаданных, которые создаются вместе с пользователем.В этом случае метаданными, определяющими вашего пользователя, являются только идентификатор пользователя и адрес электронной почты.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...