Firebase onTokenRefresh()未被调用

在我的日志中的MainActivity中,我可以使用FirebaseInstanceId.getInstance().getToken()查看令牌,并显示生成的令牌。 但似乎在我的MyFirebaseInstanceIDService ,它扩展到FirebaseInstanceIdServiceonTokenRefresh()没有被调用,在这个函数中,它被认为是在这里最初生成的令牌。 我需要调用sendRegistrationToServer()这就是为什么我想知道为什么它不在onTokenRefresh()

这是我的代码

 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); } } 

FirebaseInstanceIdService中的onTokenRefresh仅在生成新标记时调用。 如果您的应用程序之前已经安装并生成了一个令牌,那么onTokenRefresh将不会被调用。 尝试卸载并重新安装应用程序强制生成一个新的令牌,这将导致onTokenRefresh被调用。

另外请确保您的FirebaseInstanceIdService已在AndroidManifest.xml中正确定义

在你的清单文件中。

  <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> 

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) { }} 

我有和你一样的问题。 我的错误是:我把<service>标签放在AndroidManifest.xml文件的<application>标签之外。

现在我看起来像这样:

 <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> 

它工作没有任何问题。

是的,这可能会发生一些时间。

无论您想获得您的fcm id,请致电以下方法。

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

在我的情况下,我忘记了在清单中添加Internet权限,

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

希望大多数人不会犯这个错误。

尝试重新安装应用程序,先从您的设备或模拟器中卸载它。 然后它会生成一个新的标记,因此onTokenRefresh()将再次被调用。

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

onCreate方法中删除令牌。

在我的情况下,我尝试了一切,但onTokenRefresh从未被调用。 然后我改变我的WiFi ,我连接到不同的networking ,现在它的工作! 以前的WiFi具有良好的互联网连接,不知道为什么发生。 可能是这可以帮助别人。

重新安装为我做了诡计!