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);
    }
}
 Machado15 авг. 2016 г., 22:39
 Wijay Sharma06 мар. 2018 г., 19:24
Пожалуйста, прочитайте вопросы полностью. Этот вопрос не является дубликатом вопроса, который вы упомянули. @Machado

Ответы на вопрос(13)

Переустановка сделала свое дело для меня!

У меня такая же проблема. Моему устройству (kitkat 4.4.2) по какой-то причине не удалось включить onTokenRefresh (). У меня было отличное интернет-соединение, сервисы Google Play были обновлены и все необходимые условия для работы Firebase были выполнены. Мой код отлично работал на устройствах 5.0.0 и выше. Чтобы решить эту проблему, мне пришлось сбросить настройки устройства до заводских, и приложение начало работать. Я знаю, что это жесткая мера, но, возможно, это может кому-то помочь. Должны быть некоторые проблемы или конфликт с другим приложением, что привело к тому, что onTokenRefresh () не был вызван. Удачи!

Попробуйте переустановить приложение, сначала удалив его с устройства или эмулятора. Затем он сгенерирует новый токен, поэтому onTokenRefresh () будет вызван снова.

У меня была такая же проблема, как у тебя. Моя ошибка заключалась в следующем: я разместил свой<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>

И это работает без проблем.

 Juan15 окт. 2016 г., 05:43
отличный ответ ... это идентификатор Facebook, который возвращается? ....... потому что я пытаюсь сделать это, и я получаю очень большой токен
 Vinay Wadhwa26 нояб. 2016 г., 10:39
Как так много людей делают эту ошибку?
 Sagar20 нояб. 2018 г., 11:51
@viplezer на моемKITKAT не в состоянии получитьtoken выше его работы. пожалуйста помоги
 viplezer19 окт. 2016 г., 22:57
Facebook? Firebase? Вы получаете токен для Firebase Cloud Messaging в методе onTokenRefresh вашего подкласса FirebaseInstanceIDService, и да, это длинная строка, мой токен имеет длину 152 символа.
 jet_choong29 июл. 2017 г., 08:26
это решение для меня.
 viplezer26 мая 2016 г., 15:29
Кредиты идут в этой теме:stackoverflow.com/questions/37351354/...

Есть несколько причин, чтобы не вызывать метод onTokenRefresh не вызванным. Я перечислил это и упомянул об этом один за другим.

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

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

В файле 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'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 вызывается при обновлении токена и при первой установке приложения, поэтому убедитесь, что вы удалили приложение вручную или удалите данные.

7) Убедитесь, что у вас есть FirebaseMessagingService в вашем классе обслуживания

 Hoque MD Zahidul11 февр. 2019 г., 07:34
@ Сагара, если мой ответ сработает
 Sagar21 нояб. 2018 г., 07:34
да только на киткате устройство его не работает, остальное выше киткат его работает мойFCM версия11.6.2
 Sagar21 нояб. 2018 г., 07:29
на киткат девайс не смог получитьtoken FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE
 Sagar21 нояб. 2018 г., 10:53
да, спасибо за ваше время.
 Hoque MD Zahidul21 нояб. 2018 г., 07:31
Вы проверили все проблемы авобе, которые я упомянул здесь?
 Hoque MD Zahidul21 нояб. 2018 г., 09:28
О, хорошо, теперь работает?
 Sagar21 нояб. 2018 г., 08:55
измененияFCM версия для10.2.1 у меня работал мой targetSdkVersion есть27 и минимум16

Я боролся с этим больше часа, затем я изменил следующий код, и он неожиданно заработал.

обработать ваш 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);

Вам больше не нужно полагаться на получение трансляции

 danjar02 апр. 2018 г., 18:54
извините, обновленный и расширенный, спасибо за указание на это
 Matt Mc01 апр. 2018 г., 03:29
Вы говорите «android: exported = true», но пример кода говорит «android: exported = false». Что он?

Я обнаружил, что MyFirebaseInstanceIDService не вызывается, когда вы запускаете приложение на устройстве, где подключение к Интернету недоступно. Таким образом onTokenRefresh () не вызывается. Поэтому убедитесь, что ваше устройство должно иметь подключение к Интернету во время работы приложения для получения обновленного FirebaseToken.

Также удалите предыдущее приложение иRe-Install это для получения обновленного токена. Жетон регистрации меняется, когда:

1) приложение удаляет идентификатор экземпляра

2) Приложение восстановлено на новом устройстве

3) Пользователь удаляет / переустанавливает приложение

4) Пользователь очищает данные приложения.

Решение Вопроса

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

}}
 Sagar21 нояб. 2018 г., 07:24
Я проверяю это наkitkat and above устройства наkitkat onTokenRefresh метод не запускаетсяFCM version 11.6.2
 WenChao04 авг. 2016 г., 05:46
Документация кажется запутанной (firebase.google.com/docs/cloud-messaging/android/client), он говорит, что маркер регистрации может измениться, когда: приложение удаляет ID экземпляра и если я вручную вызываю FirebaseInstanceId.getInstance (). deleteInstanceId (); Я ожидал, что сгенерирован новый токен, но на самом деле ничего не происходит, onTokenRefresh никогда не вызывается.
 Alexander Farber29 мая 2017 г., 10:08
Зачем сохранять токен в общих настройках - если вы можете позвонитьFirebaseInstanceId.getInstance (). GetToken () в любое время, чтобы получить его значение?
 Salis03 июн. 2017 г., 08:20
@WenChao убедитесь, что вы называете InstanceID PlayService поInstanceID.getInstance(this).deleteInstanceID() и вызвать его из фонового потока, после того, как вы успешно удалите его, позвонитеInstanceID.getInstance(this).getID() генерировать новый токен
 Sterling Diaz14 нояб. 2017 г., 18:58
@ Александр Фарбер, это потому, что вы можете получить токен только один раз, вам нужно сохранить его, чтобы использовать его позже. Например, я делаю приложение, которое не требует регистрации пользователя, но если он хочет подписаться на определенное обновление, он может зарегистрироваться, я могу отправить токен его устройства с его данными, но если бы я получил маркер, когда он впервые установил приложение, это было бы невозможно.

В моем случае я забыл добавить разрешение на доступ в интернет в манифесте,

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

Надеюсь, что большинство людей не допустят этой ошибки.

В моем случае я попробовал все, кромеonTokenRefresh никогда не звонил. Тогда я поменяюWi-Fi и я подключаюсь к разнымсетьТеперь это сработало !! Предыдущий WiFi имеет хорошее подключение к Интернету, не знаю, почему это произошло. Может быть, это может кому-то помочь.

Убедитесь, что вы добавили

применить плагин: 'com.google.gms.google-services'

это в нижней части файла app.gradle

Да, это может случиться несколько раз.

Пожалуйста, вызовите следующий метод везде, где вы хотите получить свой идентификатор fcm.

    try {
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d("Firbase id login", "Refreshed token: " + refreshedToken);
        } catch (Exception e) {
            e.printStackTrace();
        }
 Vitaliy A02 мар. 2017 г., 17:39
Неплохо. После нескольких переустановок токен перестал обновляться, но прямой getToken вернул правильный токен.
try {
    FirebaseInstanceId.getInstance().deleteInstanceId();
} catch (IOException e) {
    e.printStackTrace();
}

вonCreate способ удалить токен.

 Rahul Matte03 окт. 2017 г., 10:57
Вы пробовали это, он бросит сеть на исключение основного потока ....
 Pierre22 февр. 2018 г., 15:08
Thread t = new Thread() будет решатьMAIN_THREAD Exception

Ваш ответ на вопрос