在我的日志MainActivity
中,我可以使用FirebaseInstanceId.getInstance().getToken()
查看令牌,并显示生成的令牌。但似乎在我的MyFirebaseInstanceIDService
中,它延伸到FirebaseInstanceIdService
,onTokenRefresh()
未被调用,在此函数中,据说最初在此处生成令牌。我需要致电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);
}
}
答案 0 :(得分:100)
只有在生成新令牌时才会调用FirebaseInstanceIdService中的onTokenRefresh。如果您的应用程序先前已安装并生成令牌,则不会调用onTokenRefresh。尝试卸载并重新安装应用程序以强制生成新令牌,这将导致调用onTokenRefresh。
还要确保在AndroidManifest.xml中正确定义了FirebaseInstanceIdService
在您的清单文件中。
<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) {
}}
答案 1 :(得分:22)
我遇到了和你一样的问题。我的错误如下:我将<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>
它没有任何问题。
答案 2 :(得分:13)
是的,这可能会发生一段时间。
如果您想获取fcm ID,请拨打以下方法。
try {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
} catch (Exception e) {
e.printStackTrace();
}
答案 3 :(得分:12)
在我的情况下,我忘了在清单中添加互联网权限,
<uses-permission android:name="android.permission.INTERNET" />
希望大多数人不会犯这个错误。
答案 4 :(得分:12)
尝试重新安装该应用,首先从您的设备或模拟器中卸载它。然后它将生成一个新令牌,因此将再次调用onTokenRefresh()。
答案 5 :(得分:3)
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
在onCreate
方法中删除令牌。
答案 6 :(得分:3)
确保您已添加
申请插件:'com.google.gms.google-services'
这是app.gradle文件的底部
答案 7 :(得分:2)
在我的情况下,我尝试了所有内容,但onTokenRefresh
从未被调用过。然后我改变 WiFi ,我连接到不同的网络,现在它工作!!以前的WiFi具有良好的互联网连接,不知道它为什么会发生。可能这可以帮助别人。
答案 8 :(得分:2)
重新安装对我有用了!
答案 9 :(得分:2)
我遇到过,当您在没有互联网连接的设备上运行应用程序时,不会调用MyFirebaseInstanceIDService。这样就不会调用onTokenRefresh()。因此,请确保您的设备在运行应用程序期间必须具有互联网连接才能获取更新的FirebaseToken。
同时卸载以前的应用&amp; 重新安装以获取更新的令牌。 注册令牌在以下时间更改:
1)应用程序删除实例ID
2)应用程序在新设备上恢复
3)用户卸载/重新安装应用程序
4)用户清除应用数据。
答案 10 :(得分:2)
不调用onTokenRefresh methon的原因有很多。我已列出并逐一提及。
请确保您已添加互联网许可
检查您是否在项目中的应用程序目录内添加了从google控制台生成的google-services.json文件
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)在项目级别的build.gridle文件中添加播放服务类路径
buildscript { // ... dependencies { // ... classpath 'com.google.gms:google-services:4.1.0' // google-services plugin } } allprojects { // ... repositories { // ... google() // Google's Maven repository } }
5)确保已在应用程序标签内的AndroidManifes文件中添加了这些服务
<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,因此请确保您已手动删除了该应用程序或清除了数据
7)确保已在服务类中扩展了FirebaseMessagingService
答案 11 :(得分:1)
我已经挣扎了一个多小时,然后我改变了下面的代码,它突然起作用了。
按原样处理你的refreshedToken:
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();
}
尝试添加 机器人:导出=&#34;真&#34;&GT;清单中的MyFirebaseMessagingService和MyFirebaseInstanceIDService,看起来像这样:
<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>
卸载您的应用,再次安装,工作。在真实设备上测试。
机器人:导出=&#34;真&#34;是一个默认选项,因此您也可以完全删除它,它将设置为true。
此外,如果您想更明确地调用onTokenRefresh,您只需在代码中的任何位置调用它:
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Localytics.setPushRegistrationId(refreshedToken);
您不必再依赖广播了
答案 12 :(得分:1)
我遇到了同样的问题。我的设备(kitkat 4.4.2)由于某种原因无法获得onTokenRefresh()。我的互联网连接非常完美,谷歌播放服务是最新的,所有必要的conbase都可以满足firebase的工作需求。我的代码在5.0.0及更高版本的设备上运行得很好。要解决此问题,我必须将设备重置为出厂设置,并且应用程序开始工作。我知道这是一个艰难的措施,但也许它可能对某些人有所帮助。必须存在一些问题或与其他应用程序冲突,这导致onTokenRefresh()不被调用。祝你好运!