Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Log da mensagem

Olá! Fiz a aula e não estou recebendo o log da mensagem. Tentei procurar erros e achei um no meu manifest, mas já foi corrigido e o log continua não aparecendo. Já reinstalei o app, mas nada aparece quando salvo um novo aluno via servidor. O que posso fazer para resolver? Códigos:

public interface DispositivoService {
    @POST("firebase/dispositivo")
    Call<Void> enviaToken(@Header("token") String token);
}
public class AgendaMessagingService extends FirebaseMessagingService{
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Map<String, String> mensagem = remoteMessage.getData();
        Log.i("mensagem recebida", String.valueOf(mensagem));
    }
}

Se precisar, tenho o projeto no Google Drive (nesse momento estou compartilhando com o Alex, instrutor), é só enviar o email que eu compartilho também! Obrigado

12 respostas

Oi Gabriel, tudo bem? Para funcionar precisa ter certeza de que no momento que o token foi gerado, ele foi enviado para o servidor. Caso não tenha certeza, recomendo que limpe os dados da app ou reinstale para que ele gere novamente o token.

Apenas por curiosidade, o token do firebase está sendo gerado normalmente?

[]s

Oi professor, tudo sim e você? Acabei de me certificar que o token está sendo enviado ao servidor, porém... tomei uma exception que levou ao crash:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.alura.agenda, PID: 4099
                  java.lang.NullPointerException: println needs a message
                      at android.util.Log.println_native(Native Method)
                      at android.util.Log.e(Log.java:232)
                      at br.com.alura.agenda.ListaAlunosActivity$4.onFailure(ListaAlunosActivity.java:110)
                      at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$2.run(ExecutorCallAdapterFactory.java:79)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

E a linha 110 citada é justamente dentro desse método onFailure:

private void buscaAlunos() {
        Call<AlunoSync> call = new RetrofitInicializador().getAlunoService().lista();
        call.enqueue(new Callback<AlunoSync>() {
            @Override
            public void onResponse(Call<AlunoSync> call, Response<AlunoSync> response) {
                AlunoSync alunoSync = response.body();
                AlunoDAO dao = new AlunoDAO(ListaAlunosActivity.this);
                dao.sincroniza(alunoSync.getAlunos());
                dao.close();
                carregaLista();
                swipe.setRefreshing(false);
            }

            @Override
            public void onFailure(Call<AlunoSync> call, Throwable t) {
                Log.e("onFailure", t.getMessage());
                swipe.setRefreshing(false);
            }
        });
    }

E aí, alguma ideia?

OBS: Sobre o que falei acima, o erro está no Log.e do onFailure

Oi Gabriel, blz?

Pode mandar o erro que o onFailure apresentou? Pois apenas está indicando um NPE sem muito motivo, repara também que foi em um ponto onde o problema inicial que você apresentou não impacta.

Se possível, me fala exatamente qual é a ação que você realiza e que provoca a exception.

[]s

Oi novamente, professor

Aparentemente o crash foi temporário, agora não está nem aparecendo. A aplicação roda normalmente e o token é gerado e enviado, tudo normal. Quando cadastro alguém no servidor, recebo isso alguns instantes depois:

W/Binder_2: type=1400 audit(0.0:42): avc: denied { read } for name="/" dev="tmpfs" ino=74 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:device:s0 tclass=dir permissive=0
W/Binder_2: type=1400 audit(0.0:43): avc: denied { search } for name="1689" dev="proc" ino=5617 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:r:zygote:s0 tclass=dir permissive=0
com.google.android.gms.persistent W/GLSUser: [AppCertManager] IOException while requesting key: 
                                                                          java.io.IOException: Invalid device key response.
                                                                              at eyw.a(:com.google.android.gms@11743470:14)
                                                                              at eyw.a(:com.google.android.gms@11743470:65)
                                                                              at eyu.a(:com.google.android.gms@11743470:8)
                                                                              at eyq.a(:com.google.android.gms@11743470:1)
                                                                              at eyp.a(:com.google.android.gms@11743470:10)
                                                                              at com.google.android.gms.auth.account.be.legacy.AuthCronChimeraService.b(:com.google.android.gms@11743470:7)
                                                                              at edr.call(:com.google.android.gms@11743470:3)
                                                                              at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                              at mmu.run(:com.google.android.gms@11743470:26)
                                                                              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                              at mse.run(:com.google.android.gms@11743470)
                                                                              at java.lang.Thread.run(Thread.java:818)

Isso no Logcat, mas nada do log da mensagem. Isso que recebi ajuda na resolução? Se não ajudar, tem algo mais que eu possa fazer?

Oi Gabriel,

Esse log não impacta no problema, pois ele refere a um deltalhe do gms. Só essas duas situações:

  • Ao adicionar um aluno no servidor, você está acontecendo algum crash na aplicação ou só esse log? (saber se tá dando crash é bem importante)

  • Você está recebendo a mensagem do servidor com o aluno que foi inserido ou modificado? Se não tem certeza, adicione um log no método que pega a mensagem recebida via Firebase.

Tenta confirmar essas ações para que fique mais fácil de eu filtrar o problema e indica a possível solução.

Olá professor,

Então, não está acontecendo mais nenhum crash, só esse log mesmo.

E realmente, não tenho certeza. Esse método que pega a mensagem do Firebase seria o onMessageReceived do AgendaMessagingService? Se sim, essa classe deveria estar em mais algum lugar além do manifest? Pois foi o único uso que achei. E o método não está sendo usado, acho que esse é o problema e eu não tinha percebido. Onde eu deveria estar usando ele? facepalm

Oi Gabriel, exato, o onMessageReceived() é o método Firebase que funciona como um serviço que vai receber as mensagens. Como comentou, é apenas no manifest mesmo.

Sobre a parte de uso, é isso mesmo, ele não é chamamo por nenhuma classe do projeto, pois ele funciona como um 'listener' que fica atento às mensagens que o Firebase enviar para a App, ou seja, quando você mandar uma mensagem para o servidor, o servidor vai mandar para o Firebase, e então, o Firebase vai mandar pra App. Quando a App recebe a mensagem, o onMessageReceived() é assionado, dentro dele, você pode pegar a mensagem, que nesse caso é o aluno que o servidor mandou...

Por isso que é importante saber se pelo menos esse método está sendo chamado quando você envia um aluno para o servidor, você pode até colocar um log dentro dele apenas para verificar se ele é chamado.

Caso ele esteja sendo chamado, aí o detalhe está entre converter a mensagem em um aluno, gravar no banco de dados da App e atualizar a lista de alunos. Consegue verificar qual ponto do fluxo que descrevi está falhando?

Oi professor, obrigado pela explicação, achei que eu tinha escrito o código errado no AlunoMessagingService. Verifiquei aqui, e acho que o problema não é no log da mensagem, pois recebi isso:

I/mensagem recebida: {alunoSync={"momentoDaUltimaModificacao":"2017-12-13T13:29:48.069","alunos":[{"telefone":"4398574845","site":"www.sitedoluis.com","endereco":"rua do luis","idCliente":0,"nome":"Luis","id":"110cd8d5-d0ee-4461-b0cb-a73a06bfd4fb","nota":10.0,"desativado":0}]}}

Porém, a lista não atualiza sozinha, só se dou swipe refresh. Agora que sabemos onde está o problema, como podemos resolver? tem algo que eu posso mandar pra você verificar?

solução!

Boa Gabriel! Você está recebendo o aluno.

Acho que dei spoiler kkk... A parte da conversão do aluno e atualização da lista de alunos é na próxima aula (aula 3), portanto, da uma olhada nela e veja se tudo funciona de acordo.

Caso tiver algum problema é só avisar. Já que essa parte de rececber o aluno foi resolvida, tudo bem de marcar o tópico como resolvido?

[]s

Eita, acho que é a segunda vez que forcei spoiler, fiz o mesmo em um dos últimos tópicos que abri e só percebi quando fiz a aula seguinte kkkk

Pelo menos estou percebendo problemas, e isso é bom pra alguém que quer carreira nessa área, né? auhauhauahua

Obrigado novamente, professor! Vou marcar como resolvido

Opa Gabriel, acontece, às vezes não olho a aula que o aluno está e por isso não percebo também que está rolando um spoiler kkk

Exato, é muito importante treinar essa analise para encontrar os problemas, pois no dia a dia envolve bastante entender o motivo do erro para então tomar uma ação.

Blz, precisando é só entrar em contato com a gente.

[]s