Dans mon MainActivity
dans mon journal, je peux voir le jeton à l'aide de FirebaseInstanceId.getInstance().getToken()
et afficher le jeton généré. Mais il semble que dans mon MyFirebaseInstanceIDService
où il est étendu à FirebaseInstanceIdService
, la onTokenRefresh()
ne soit pas appelée, où dans cette fonction il a été dit que le jeton est initialement généré ici. J'avais besoin d'appeler sendRegistrationToServer()
c'est pourquoi j'essaie de savoir pourquoi cela ne va pas dans la onTokenRefresh()
.
Voici mon code
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 dans FirebaseInstanceIdService est appelé uniquement lorsqu'un nouveau jeton est généré. Si votre application a déjà été installée et a généré un jeton, onTokenRefresh ne sera pas appelé. Essayez de désinstaller et de réinstaller l'application pour forcer la génération d'un nouveau jeton. Cela entraînerait l'appel de onTokenRefresh.
Assurez-vous également que votre FirebaseInstanceIdService est correctement défini dans votre AndroidManifest.xml.
Dans votre fichier manifeste.
<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>
Classe 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.
}}
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) {
}}
J'ai eu le même problème que toi. Mon erreur est la suivante: j'ai placé mes balises <service>
en dehors de la balise <application>
dans le fichier AndroidManifest.xml.
Maintenant le mien ressemble à ceci:
<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>
Et cela fonctionne sans aucun problème.
Oui, cela peut arriver parfois.
Veuillez appeler la méthode suivante où vous voulez obtenir votre identifiant fcm.
try {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
} catch (Exception e) {
e.printStackTrace();
}
Essayez de réinstaller l'application en la désinstallant d'abord de votre appareil ou de votre émulateur. Il générera alors un nouveau jeton, ainsi onTokenRefresh () sera appelé à nouveau.
Dans mon cas, j'ai oublié d'ajouter la permission Internet dans le manifeste,
<uses-permission Android:name="Android.permission.INTERNET" />
J'espère que la plupart des gens ne feront pas cette erreur.
Assurez-vous d'avoir ajouté
appliquer le plugin: 'com.google.gms.google-services'
ceci au bas du fichier app.gradle
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
dans onCreate
méthode pour supprimer le jeton.
Réinstaller a fait le tour pour moi!
J'ai constaté que MyFirebaseInstanceIDService n'est pas appelé lorsque vous exécutez votre application sur un périphérique où la connectivité Internet n'est pas disponible. De cette façon, onTokenRefresh () n'est pas appelé. Assurez-vous donc que votre appareil doit disposer d'une connexion Internet lors de l'exécution de votre application pour pouvoir prendre à jour FirebaseToken.
Désinstallez également l’application précédente & Re-Install pour prendre le jeton mis à jour. Le jeton d'enregistrement change lorsque:
1) L'application supprime l'ID d'instance
2) L'application est restaurée sur un nouvel appareil
3) l'utilisateur désinstalle/réinstalle l'application
4) L'utilisateur efface les données de l'application.
Dans mon cas, j'ai tout essayé mais onTokenRefresh
n’a jamais été appelé. Ensuite, je change de WiFi et je me connecte à différents résea, maintenant cela a fonctionné !!. Le WiFi précédent a une bonne connectivité Internet, je ne sais pas pourquoi. Peut-être que cela peut aider quelqu'un.
Il y a plusieurs raisons de ne pas appeler le methon onTokenRefresh non appelé. Je l'ai énuméré et le mentionne un par un.
S'il vous plaît assurez-vous que vous avez ajouté la permission Internet
vérifiez que vous avez ajouté le fichier google-services.json généré à partir de la console Google dans le répertoire app de votre projet.
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) ajouter le chemin de classe de service de lecture dans le fichier build.gridle au niveau du projet
buildscript { // ... dependencies { // ... classpath 'com.google.gms:google-services:4.1.0' // google-services plugin } } allprojects { // ... repositories { // ... google() // Google's Maven repository } }
5) Assurez-vous que vous avez ajouté ce service dans le fichier AndroidManifes dans la balise d'application.
<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) OnToken refresh est appelé lors de l'actualisation du jeton et de la première installation de l'application. Assurez-vous donc d'avoir supprimé l'application manuellement ou effacez les données.
7) Assurez-vous d’avoir étendu le FirebaseMessagingService dans votre classe de service.
[ Remarque : Si sa version ne fonctionne pas uniquement pour une version spécifique, par exemple Android version KitKat, essayez de modifier la version de fcm.]
Cela fait plus d’une heure que je me bats avec cela, puis j’ai modifié le code suivant et cela a soudainement fonctionné.
manipulez votre régénéré comme tel:
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();
}
Essayez d’ajouter Android: installed = "true"> à MyFirebaseMessagingService et à MyFirebaseInstanceIDService dans le fichier manifest, de sorte qu’il se présente comme suit:
<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>
Désinstallez votre application, installez à nouveau, a travaillé. Testé sur un appareil réel.
Android: exports = "true" est une option par défaut, vous pouvez donc également le supprimer entièrement. Il sera défini sur true.
De plus, si vous souhaitez appeler onTokenRefresh plus explicitement, vous pouvez simplement appeler cela n'importe où dans votre code:
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Localytics.setPushRegistrationId(refreshedToken);
Vous n'êtes plus obligé de compter sur la diffusion
J'ai eu le même problème. Mon périphérique(KitKat 4.4.2)
ne peut pas obtenir onTokenRefresh()
pour une raison quelconque. Ma connexion Internet était parfaite, les services de Google Play étaient à jour et toutes les conditions nécessaires au bon fonctionnement de firebase étaient réunies. Mon code fonctionnait parfaitement sur les appareils 5.0.0
et supérieurs. Pour résoudre ce problème, j'ai dû réinitialiser mon appareil aux paramètres d'usine et l'application a commencé à fonctionner. Je sais que c'est une mesure difficile, mais peut-être que cela peut aider quelqu'un. Il doit y avoir des problèmes ou des conflits avec d'autres applications, ce qui a empêché onTokenRefresh()
de s'appeler. Bonne chance!