FirebaseInstanceId.getInstance() всегда имеет значение null

У меня возникла проблема, когда я пытаюсь получитьToken() из Firebase, но не могу получить токен из-за следующей ошибки:

Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.firebase.iid.FirebaseInstanceId.getInstanceId()' on a null object reference

Ваша служба зарегистрирована в манифесте?

cutiko 07.02.2019 20:27

@cutiko добавил мой файл манифеста в основной пост.

FlameDra 07.02.2019 20:37

Вам нужен только MyFirebaseMessagingService firebase.google.com/docs/cloud-messaging/android/…

cutiko 07.02.2019 21:03

Похоже, ваш обмен сообщениями Firebase не инициализируется. Вы сделали что-нибудь, чтобы предотвратить автоматическую инициализацию, как указано здесь. firebase.google.com/docs/cloud-messaging/android/client

Ranjan 08.02.2019 05:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
2 911
4

Ответы 4

FirebaseInstanceId.getInstance() устарел
Вы можете получить firebase_token в функции onNewToken()

public class MyFirebaseMessagingService extends FirebaseMessagingService {

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
    // s is your token
    // Do whatever you want with it
    // You can store it in SharedPreferences
}}

Я уже использую onNewToken, как вы можете видеть в моем коде. Я думал, что FirebaseInstanceId.getInstance().getInstanceId() — это новый нерекомендуемый метод в Activitis? Почему я получаю значение null для FirebaseInstanceId.getInstance(), когда пытаюсь получить к нему доступ в моем файле Notification.java?

FlameDra 07.02.2019 23:33

Нет getInstanceId() устарел. См. здесь stackoverflow.com/questions/51125169/…

Abhinav Suthar 08.02.2019 04:24

В нем говорится: «Этот метод устарел. В пользу getInstanceId ()», который я использую.

FlameDra 08.02.2019 20:39

Я не уверен, но вам нужно инициализировать Firebase в своей деятельности.

FirebaseApp.initializeApp (ваша активность);

please check if you added this (com.google.firebase:firebase-messaging:17.3.4')dependency in your gradle file. for frther help you can get the help from here. and if you want to get the Token this way.String refreshedToken = FirebaseInstanceId.getInstance().getToken();

разве getInstance().getToken() сейчас не устарел?

FlameDra 08.02.2019 20:37

Я сталкиваюсь с той же проблемой, когда создаю приложение с помощью BUCK, но я могу правильно использовать Firebase при сборке с Gradle. Вы можете проверить, что Firebase был инициализирован. Вы должны увидеть это в своих журналах, если это так:

I/FirebaseInitProvider: FirebaseApp initialization successful

Глядя на документацию здесь: https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId, FirebaseInstanceId.getInstance().getToken() устарел в пользу getInstanceId().

Вместо этого в этой документации показано, как получить текущий токен firebase: https://firebase.google.com/docs/cloud-messaging/android/client?authuser=1#retrieve-the-current-registration-token

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String token = task.getResult().getToken();

                // Log and toast
                String msg = getString(R.string.msg_token_fmt, token);
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

В этой документации говорится, что метод onNewToken вызывается при обновлении токена: https://firebase.google.com/docs/cloud-messaging/android/client?authuser=1#monitor-token-generation

/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */
@Override
public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // Instance ID token to your app server.
    sendRegistrationToServer(token);
}

С Gradle я смог заставить это работать с этими библиотеками:

implementation 'com.google.firebase:firebase-messaging:18.0.0'
implementation 'com.google.firebase:firebase-auth:17.0.0'

Я перешел с GCM на FCM, и документация была проста для того, чтобы заставить его работать с Gradle: https://developers.google.com/cloud-messaging/android/android-migrate-fcm

Эта документация также кажется простой, если вы используете Gradle для сборки: https://firebase.google.com/docs/cloud-messaging/android/client?authuser=1#monitor-token-generation

Другие вопросы по теме