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

Token não está sendo enviado

Boa noite.

No Log de execução do meu aplicativo o token é gerado, mas dá erro ao enviar para o servidor. Segue o trecho do erro:

D/OkHttp: token: eAEejOU8sPA:APA91bHWs5CmPWBXabRm-nHBsqqu4IB_zBONyDb2wnvDW7Tz98qqrFU6CRlJjnDU--BCpYRTFsbX5DKM-7QDcgaFweU5IOwCIfs7MGGb-7v-KSS7X8yTklocxOm40Al_OtRIm70OA7xi
D/OkHttp: --> END POST (0-byte body)
I/FirebaseCrash: Sending crashes
V/FA: Inactivity, disconnecting from the service
D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeoutException: timeout
E/onFailure chamado: timeout
D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeoutException
D/AndroidRuntime: Shutting down VM
E/UncaughtException: java.lang.NullPointerException: println needs a message
                         at android.util.Log.println_native(Native Method)
                         at android.util.Log.e(Log.java:334)
                         at com.example.jefacb10.agenda.firebase.AgendaInstancedIdService$1.onFailure(AgendaInstancedIdService.java:38)
                         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:7325)
                         at java.lang.reflect.Method.invoke(Native Method)
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
D/FA: Logging event (FE): app_exception(_ae), Bundle[{firebase_event_origin(_o)=crash, timestamp=1510088905808, fatal=1}]
V/FA: Using measurement service
V/FA: Connecting to remote service
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.jefacb10.agenda, PID: 16104
                  java.lang.NullPointerException: println needs a message
                      at android.util.Log.println_native(Native Method)
                      at android.util.Log.e(Log.java:334)
                      at com.example.jefacb10.agenda.firebase.AgendaInstancedIdService$1.onFailure(AgendaInstancedIdService.java:38)
                      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:7325)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
I/FirebaseCrash: Sending crashes
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/FirebaseCrash: Response code: 200
I/FirebaseCrash: Report sent with crash report id: c592583374000000
I/Process: Sending signal. PID: 16104 SIG: 9
Application terminated.

Podem me ajudar?

5 respostas

Ou Jeferson, blz? Pode enviar o código do messaging como também o código do service que envia o token para o server?

Boa noite, Alex,

Segue o código dos dois:

  • MessagingService
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));

    }
}
  • InstancedIdService
public class AgendaInstancedIdService extends FirebaseInstanceIdService {
   @Override
    public void onTokenRefresh(){
       // Get updated InstanceID token.
       String refreshedToken = FirebaseInstanceId.getInstance().getToken();
       Log.d("token firebase", "Refreshed token: " + refreshedToken);

       // TODO: Implement this method to send any registration to your app's servers.
       enviaTokenParaServidor(refreshedToken);
   }

    private void enviaTokenParaServidor(final String token) {
        Call<Void> callToken = new RetrofitInicializador().getDispositivoService().enviaToken(token);
        callToken.enqueue(new Callback<Void>() {
            @Override
            public void onResponse(Call<Void> call, Response<Void> response) {
                Log.i("token enviado", token);
            }

            @Override
            public void onFailure(Call<Void> call, Throwable t) {
                Log.e("token falhou",t.getMessage());
            }
        });
    }
}
  • DispositivoService
public interface DispositivoService {

    @POST("firebase/dispositivo")
    Call<Void> enviaToken(@Header("token") String token);
}
solução!

Oi Jeferson, tudo bem? Olhando o seu código parece que tá tudo certo e o erro foi por causa de um timeout...

Geralmente timeout acontece quando não é possível se conectar com o servidor, ou seja, talvez seja a URL base que esteja errada ou alguma falha de conexão do dispositivo ou emulador.

A minha sugestão é que tente enviar novamente o token para o servidor.

Uma das maneiras que vc pode fazer é removendo os dados da App e executando novamente, essa é a maneira mais fácil.

Caso não der certo, me envia o código do projeto via GitHub para eu dar uma olhada, pode ser?

Olá, Alex, Boa tarde.

Agradeço sua ajuda. Verifiquei o procedimento do firebase no Android Studio e faltou colocar no Manifest.xml o trecho referente a mensagem do servidor. Ao consertar o código deu certo.

Abraços!

Opa Jeferson, que bom que deu certo! Caso surgir mais dúvidas fique à vontade em entrar em contato com a gente :)

Abraços e bons estudos.