studio receive notification firebaseinstanceidservice data android firebase firebase-cloud-messaging firebase-notifications

android - receive - No se llama a Firebase onTokenRefresh()



push notifications android (13)

En mi MainActivity en mi registro, puedo ver el token usando FirebaseInstanceId.getInstance().getToken() y muestra el token generado. Pero parece que en mi MyFirebaseInstanceIDService donde se extiende a FirebaseInstanceIdService , no se llama a onTokenRefresh() , donde en esta función se dijo que el token se genera inicialmente aquí. Necesitaba llamar a sendRegistrationToServer() por eso estoy tratando de saber por qué no va en onTokenRefresh() .

Aqui esta mi codigo

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


onTokenRefresh en FirebaseInstanceIdService solo se llama cuando se genera un nuevo token. Si su aplicación se instaló previamente y generó un token, entonces no se llamaría a onTokenRefresh. Intente desinstalar y reinstalar la aplicación para forzar la generación de un nuevo token, esto provocaría que se llamara a onTokenRefresh.

También asegúrese de que su FirebaseInstanceIdService esté correctamente definido en su AndroidManifest.xml

En su archivo de manifiesto.

<service android:name="com.bnt.etailers.fcm.MyFireBaseInstanceIDService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT" /> </intent-filter> </service> <service android:name="com.bnt.etailers.fcm.GCMNotificationIntentService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>

Clase FirebaseInstanceIdService

public class MyFireBaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = MyFireBaseInstanceIDService.class.getSimpleName(); @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); if (refreshedToken!=null) { SettingPreferences.setStringValueInPref(this, SettingPreferences.REG_ID, refreshedToken); } // TODO: Implement this method to send any registration to your app''s servers. sendRegistrationToServer(refreshedToken); } // [END refresh_token] /** * Persist token to third-party servers. * * Modify this method to associate the user''s FCM InstanceID token with any server-side account * maintained by your application. * * @param token The new token. */ private void sendRegistrationToServer(String token) { // Add custom implementation, as needed. }}

Clase FirebaseMessagingService.

public class GCMNotificationIntentService extends FirebaseMessagingService { // Sets an ID for the notification, so it can be updated public GCMNotificationIntentService() { super(); } @Override public void onMessageReceived(RemoteMessage message) { }}


Asegúrate de haber agregado

aplique el complemento: ''com.google.gms.google-services''

esto al final del archivo app.gradle


En mi caso, olvidé agregar el permiso de Internet en manifiesto,

<uses-permission android:name="android.permission.INTERNET" />

Espero que la mayoría de la gente no cometa este error.


En mi caso, probé todo, pero onTokenRefresh nunca fue llamado. Luego cambio mi WiFi y me conecto a una red diferente. ¡Ahora funcionó! El WiFi anterior tiene buena conectividad a Internet, no sé por qué estaba sucediendo. Puede ser que esto pueda ayudar a alguien.


Hay varias razones para no llamar al methon onTokenRefresh no llamado. Lo he enumerado y lo menciono uno por uno.

  1. Asegúrate de haber agregado el permiso de Internet

  2. compruebe si ha agregado el archivo google-services.json que se genera desde la consola de google dentro del directorio de la aplicación en su proyecto

  1. En el archivo Gradle de su módulo (generalmente la aplicación / build.gradle), agregue la línea de complemento de aplicación en la parte inferior del archivo para habilitar el complemento Gradle:

apply plugin: ''com.android.application'' android { // ... } dependencies { // ... implementation ''com.google.firebase:firebase-core:16.0.4'' // Getting a "Could not find" error? Make sure you have // added the Google maven respository to your root build.gradle } // ADD THIS AT THE BOTTOM apply plugin: ''com.google.gms.google-services''

4) agregue la ruta de clase de servicio de reproducción en el archivo build.gridle a nivel de proyecto

buildscript { // ... dependencies { // ... classpath ''com.google.gms:google-services:4.1.0'' // google-services plugin } } allprojects { // ... repositories { // ... google() // Google''s Maven repository } }

5) Asegúrese de haber agregado esos servicios en el archivo AndroidManifes dentro de la etiqueta de la aplicación

<service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> </application>

6) Se llama a la actualización onToken cuando se actualiza el token y cuando se instala la aplicación por primera vez, así que asegúrese de haber eliminado la aplicación manualmente o borrar los datos

7) Asegúrese de haber extendido FirebaseMessagingService en su clase de servicio

[ Nota : Si no funciona solo para una versión específica, por ejemplo, la versión de Android Kitkat, intente cambiar la versión de fcm.]


He estado luchando con eso durante más de una hora, luego cambié el siguiente código y de repente funcionó.

maneje su Tomado renovado como tal:

String refreshedToken; try { refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); Localytics.setPushRegistrationId(refreshedToken); } catch (Exception e) { Log.d(TAG, "Refreshed token, catch: " + e.toString()); e.printStackTrace(); }

Intente agregar android: exported = "true"> a MyFirebaseMessagingService y MyFirebaseInstanceIDService en manifiesto para que se vea así:

<service android:name="com.localytics.android.sample.fcm.MyFirebaseMessagingService" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name="com.localytics.android.sample.fcm.MyFirebaseInstanceIDService" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>

Desinstale su aplicación, Instale nuevamente, funcionó. Probado en dispositivo real.

android: exported = "true" es una opción predeterminada, por lo que también puede eliminarla por completo y se establecerá en true.

Además, si desea llamar a OnTokenRefresh más explícitamente, simplemente puede llamarlo en cualquier parte de su código:

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

Ya no tiene que confiar en que la transmisión se reciba


He experimentado que no se llama a MyFirebaseInstanceIDService cuando ejecuta su aplicación en un dispositivo donde la conectividad a Internet no está disponible. De esta manera, no se llama a onTokenRefresh (). Así que asegúrese de que su dispositivo debe tener conexión a Internet durante la ejecución de su aplicación para tomar FirebaseToken actualizado.

Desinstale también la aplicación anterior y vuelva a instalarla para tomar el token actualizado. El token de registro cambia cuando:

1) La aplicación elimina la ID de instancia

2) La aplicación se restaura en un nuevo dispositivo

3) El usuario desinstala / reinstala la aplicación

4) El usuario borra los datos de la aplicación.


Intente reinstalar la aplicación, primero desinstálela de su dispositivo o emulador. Luego generará un nuevo token, por lo que se volverá a llamar a onTokenRefresh ().


Reinstalar hizo el truco para mí.


Sí, esto puede suceder algunas veces.

Llame al siguiente método donde desee obtener su identificación de fcm.

try { String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d("Firbase id login", "Refreshed token: " + refreshedToken); } catch (Exception e) { e.printStackTrace(); }


Tuve el mismo problema que tú. Mi error fue el siguiente: coloqué mis etiquetas <service> fuera de la etiqueta <application> en el archivo AndroidManifest.xml.

Ahora el mío se ve así:

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> <service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> </application>

Y funciona sin ningún problema.


Yo tuve el mismo problema. Mi dispositivo (kitkat 4.4.2) no pudo acceder onTokenRefresh() por alguna razón. Mi conexión a Internet era perfecta, los servicios de Google Play estaban actualizados y se cumplieron todas las condiciones necesarias para que Firebase funcione. Mi código funcionó perfectamente en los dispositivos 5.0.0 y superiores. Para resolver este problema, tuve que restablecer mi dispositivo a la configuración de fábrica y la aplicación comenzó a funcionar. Sé que es una medida difícil, pero tal vez pueda ayudar a alguien. Debe haber algunos problemas o conflictos con otra aplicación, lo que hizo que no se llamara a onTokenRefresh() . ¡Buena suerte!


try { FirebaseInstanceId.getInstance().deleteInstanceId(); } catch (IOException e) { e.printStackTrace(); }

en el método onCreate para eliminar el token.