Android: el token de Firebase es nulo al principio

Estoy utilizando FCM para proporcionar notificaciones en mi aplicación. Todo funcionó bien, pero ahora me di cuenta de que, cuando instalo mi aplicación utilizando Android Studio (no de GooglePlay) el token es nulo al principio. Cuando cierre mi aplicación y la reinicie, el token ya no es nulo. ¿Qué causa este problema y cómo puedo evitarlo?

InstanceIDService:

public class InstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { OkHttpClient client = new OkHttpClient(); RequestBody body = new FormBody.Builder() .add("Token",token) .build(); Request request = new Request.Builder() .url("url_to_registration_script") .post(body) .build(); try { client.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } } } 

En MainActivity:

 FirebaseMessaging.getInstance().subscribeToTopic("topic"); String token = FirebaseInstanceId.getInstance().getToken(); Log.d("TOKEN", token); 

El último registro devuelve null cuando la aplicación se instala y se inicia por primera vez

Script de registro:

  <?php if (isset($_POST["Token"])) { $_uv_Token=$_POST["Token"]; $conn = mysqli_connect("localhost","user","pass","db") or die("Error connecting"); $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') " ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';"; mysqli_query($conn,$q) or die(mysqli_error($conn)); mysqli_close($conn); } ?> 

El token se obtiene de forma asincrónica en el primer inicio de la aplicación. Tienes que esperar a que onTokenRefresh() sea ​​llamado en tu FirebaseInstanceIdService antes de que se pueda acceder al token.

Desinstale la aplicación del emulador y ejecute de nuevo, para que el método onTokenRefreshed se llame de nuevo.

Para comprobar si ya está registrado y desea saber el FCM TOken

 String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

Agregue la línea anterior en la clase MyFirebaseMessagingService en cualquier lugar (en el método oncreate) y solo Toast o registre el refreshedToken.

Incluso tuve el mismo problema. Yo había dado la sentencia de registro para imprimir token en onCreate de mi actividad de lanzador. Se tarda un tiempo en actualizar el token una vez que desinstala la aplicación. Es por eso que obtienes nulo. Tienes que esperar un poco para que el token se refresque.

Acabo de caer en el mismo problema y esta es la forma en que lo arregló. Llame al bloque en algún lugar del método onCreate() de su actividad. Quiero enviar el token a mi servidor de análisis, por lo que debe cambiarlo en función de sus necesidades.

Esta es la muestra que seguí.

 private void subscribeUserToParse() { String deviceToken = FirebaseInstanceId.getInstance().getToken(); if (TextUtils.isEmpty(deviceToken)) { Intent intent = new Intent(this, MyFirebaseInstanceIDService.class); startService(intent); return; } User user = UserUtil.retrieveUserFromDB(mRealm); String objectId = user.getParseObjectId(); if (!TextUtils.isEmpty(objectId)) { ParseUtils.subscribeWithUsersObjectId(objectId, deviceToken); } } 

Yo estaba enfrentando el mismo problema. Miré a través de un montón de puestos SO y otros foros y encontré una solución que funcionó para mí. La documentación de FCM dice que se debe usar este método para obtener un token.

 String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

He encontrado un post en línea (me disculpo, no recuerdo cuál, lo encontré hace un tiempo) que utilizó este método en su lugar:

 String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope); 

La documentación de FCM describe el primer método como:

Devolver el token maestro para el proyecto Firebase predeterminado.

Mientras que el segundo se describe como:

Devuelve un token que autoriza a una Entidad a realizar una acción en nombre de la aplicación identificada por ID de Instancia. Esto es similar a un token OAuth2 excepto, se aplica a la instancia de la aplicación en lugar de a un usuario. Por ejemplo, para obtener un token que se puede utilizar para enviar mensajes a una aplicación a través de FirebaseMessaging, establezca el ID de remitente y establezca en "FCM".

He estado buscando por qué la primera llamada de método tarda más tiempo en devolver un token, pero aún no he encontrado una respuesta. Espero que esto ayude.

Sólo reemplazar:

 String token = instanceID.getToken(); 

con:

 String token = instanceID.getToken($SENDER_ID, "FCM"); 

Y funcionará.

Simplemente agregando esto funcionará.

 if(regid == null) { regid = FirebaseInstanceId.getInstance().getToken(); } 
  • ¿Es FCM (firebase cloud messaging) Token para un dispositivo o para una cuenta?
  • Mensaje de la nube de Firebase que no recibe la notificación
  • Firebase Cloud Messaging colapse_key no se ha recibido (tasa limitada?)
  • ¿Es necesaria la migración de GCM a FCM?
  • Anular la suscripción de todos los temas a la vez desde la mensajería de Firebase
  • Negación en condición de envío de mensaje FCM
  • ¿Cómo implementar la mensajería cloud firebase en el lado del servidor?
  • Cómo manejar la notificación cuando la aplicación en segundo plano en Firebase
  • Los grupos de dispositivos Firebase Cloud Messaging se filtran
  • Qué es "serviceAccountKey.json" que se refiere en el tutorial de notificaciones de dispositivo a dispositivo de Firebase
  • No hay sonido de notificación al enviar notificación de firebase en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.