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.
-
Asegúrate de haber agregado el permiso de Internet
-
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
- 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.