Firebase onTokenRefresh() не вызывается
В моем 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);
}
}
Ответы
Ответ 1
onTokenRefresh в FirebaseInstanceIdService вызывается только при создании нового токена. Если ваше приложение было ранее установлено и сгенерировано токен, то 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 servers.
sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]
/**
* Persist token to third-party servers.
*
* Modify this method to associate the user 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) {
}}
Ответ 2
У меня была такая же проблема, как и вы. Моя ошибка заключалась в следующем: я разместил теги <service>
вне тега <application>
в файле AndroidManifest.xml.
Теперь мой выглядит следующим образом:
<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>
И он работает без каких-либо проблем.
Ответ 3
Да, это может произойти несколько раз.
Пожалуйста, вызовите следующий метод, где бы вы не захотели получить свой fcm id.
try {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
} catch (Exception e) {
e.printStackTrace();
}
Ответ 4
В моем случае я забыл добавить интернет-разрешение в манифест,
<uses-permission android:name="android.permission.INTERNET" />
Надеюсь, что большинство людей не допустят этой ошибки.
Ответ 5
Попробуйте переустановить приложение, удалив его сначала с вашего устройства или эмулятора. Затем он сгенерирует новый токен, поэтому onTokenRefresh() будет вызываться снова.
Ответ 6
try {
FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
e.printStackTrace();
}
в onCreate
для удаления токена.
Ответ 7
Убедитесь, что вы добавили
применить плагин: 'com.google.gms.google-services'
это в нижней части файла app.gradle
Ответ 8
В моем случае я пробовал все, но onTokenRefresh
никогда не вызывался. Затем я меняю свой WiFi и подключаюсь к другой сети, теперь это сработало!!. Предыдущий WiFi имеет хорошее подключение к Интернету, не знаю, почему это происходит. Может быть, это может помочь кому-то.
Ответ 9
Переустановка сделала для меня трюк!
Ответ 10
Я обнаружил, что MyFirebaseInstanceIDService не вызывается, когда вы запускаете приложение на устройстве, где подключение к Интернету недоступно. Таким образом onTokenRefresh() не вызывается. Поэтому убедитесь, что ваше устройство должно иметь подключение к Интернету во время работы приложения для получения обновленного FirebaseToken.
Также удалите предыдущее приложение и переустановите его для получения обновленного токена. Токен регистрации меняется, когда:
1) Приложение удаляет идентификатор экземпляра
2) Приложение восстановлено на новом устройстве
3) Пользователь удаляет/переустанавливает приложение
4) Пользователь очищает данные приложения.
Ответ 11
Есть несколько причин, чтобы не вызывать метод onTokenRefresh не вызванным. Я перечислил это и упомянул об этом один за другим.
-
Пожалуйста, убедитесь, что вы добавили интернет-разрешение
-
проверьте, добавили ли вы файл google-services.json, который генерируется из консоли Google в каталоге приложения в вашем проекте
![enter image description here]()
- В файле Gradle вашего модуля (обычно это app/build.gradle) добавьте строку плагина apply в нижней части файла, чтобы включить плагин 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) добавить путь к классу обслуживания play в файл build.gridle уровня проекта
buildscript {
// ...
dependencies {
// ...
classpath 'com.google.gms:google-services:4.1.0' // google-services plugin
}
}
allprojects {
// ...
repositories {
// ...
google() // Google 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 вызывается при обновлении токена и при первой установке приложения, поэтому убедитесь, что вы удалили приложение вручную или удалите данные.
7) Убедитесь, что у вас есть FirebaseMessagingService в вашем классе обслуживания
[ Примечание: если он не работает только для определенной версии, например, для версии Android KitKat, попробуйте изменить версию FCM.]
Ответ 12
Я боролся с этим больше часа, затем я изменил следующий код, и он неожиданно заработал.
обработать ваш 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();
}
Попробуйте добавить android: exported = "true"> в 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>
Удалите приложение, установите снова, сработало. Проверено на реальном устройстве.
android: exported = "true" - это опция по умолчанию, поэтому вы также можете полностью удалить ее, и для нее будет установлено значение true.
Также, если вы хотите вызвать onTokenRefresh более явно, вы можете просто вызвать это в любом месте своего кода:
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Localytics.setPushRegistrationId(refreshedToken);
Вам больше не нужно полагаться на получение трансляции
Ответ 13
У меня такая же проблема. Моему устройству (kitkat 4.4.2)
onTokenRefresh()
по какой-то причине не удалось onTokenRefresh()
. У меня было отличное интернет-соединение, сервисы Google Play были обновлены и все необходимые условия для работы Firebase были выполнены. Мой код отлично работал на устройствах 5.0.0
и выше. Чтобы решить эту проблему, мне пришлось сбросить настройки устройства до заводских, и приложение начало работать. Я знаю, это жесткая мера, но, возможно, это может кому-то помочь. Должны быть некоторые проблемы или конфликт с другим приложением, из-за чего onTokenRefresh()
не вызывался. Удачи!