Подтвердить что ты не робот

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

Ответ 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 не вызванным. Я перечислил это и упомянул об этом один за другим.

  1. Пожалуйста, убедитесь, что вы добавили интернет-разрешение

  2. проверьте, добавили ли вы файл google-services.json, который генерируется из консоли Google в каталоге приложения в вашем проекте

enter image description here

  1. В файле 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() не вызывался. Удачи!