TransWikia.com

Push уведомления через Firebase

Stack Overflow на русском Asked by ВуDengin on January 4, 2022

Почему то, приложение перестало получать пуши. Отправляю через консоль Firebase, уведомления изначально приходили, но без звука и не отображались на экране, были видны только в общем списке уведомлений.

AndroidManifest

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

    <activity
        android:name=".DialogActivity"
        android:parentActivityName=".ResponseActivity"
        android:screenOrientation="portrait" >

        <intent-filter>
            <action android:name=".DialogActivity" />
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>

    </activity>

    <service
        android:name=".MyService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

    <service
        android:name=".MyFirebaseInstanceIDService"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>

MyService

public class MyService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    sendNotification(remoteMessage.getNotification().getBody());
}

private void sendNotification(String messageBody) {

    Intent intent = new Intent(this, DialogActivity.class); // года приходили уведомления, при клике все равно открывалоль MainActivity
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 , intent,PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder notificationBuilder =

            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.mipmap.logo)
                    .setContentTitle("Title")
                    .setContentText(messageBody)
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri) 
                    .setContentIntent(pendingIntent);

    NotificationManager notificationManager =

            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0, notificationBuilder.build());

}

}

Вообще не понятно, когда срабатывает данный сервис, что бы он оправил данные на сервер ни разу не приходил токен.
Мне необходимо в коде получить токен устройства, я это делаю при отправке данных на сервер вызывая FirebaseInstanceId.getInstance().getToken().
Все работало, я получал токен, сейчас это у меня вызывает ошибку

java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process ru.test.app. Make sure to call FirebaseApp.initializeApp(Context) first.
    at com.google.firebase.FirebaseApp.getInstance(SourceFile:218)
    at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)

При первоначальном вызове FirebaseApp.initializeApp(Context), у меня все равно вылетает

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.iid.FirebaseInstanceId.getToken()' on a null object reference

Как получить токен устройства, что бы оправлять на это устройство уведомление?

MyFirebaseInstanceIDService

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    public void onTokenRefresh() {
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d("ddd", "Refreshed token: " + refreshedToken);

        sendRegistrationToServer(refreshedToken);
    }

    private void sendRegistrationToServer(String refreshedToken) {
      // код обновления токена на сервере
    }}

Вот такой код, но не работает, уведомления не получаю, отправляя их с консоли.
Подскажите пожалуйста, где искать проблему!

One Answer

Ваши симптомы такие:

  • если вы не вызываете FirebaseApp.initializeApp(Context) в Application.onCreate - сделайте это
  • Добавьте проверку при получении getInstance - если он вернул Null, скорее всего он не проинициализировался, у вас проблема с конфигурацией. Прогоните еще раз wizard из Android Studio

По опыту получение токена работает неплохо так:

  • Если при старте вам сразу отдали закэшированный токен - сохраните его, и в зависимости от вашего статуса логина отправьте его (обычно токен привязывают к пользователю)
  • Если токен не отдали (Null) скорее всего он еще не получен, и ждете его через ваш сервис
  • На сервере не забывайте чистить тот же самый токен у других пользователей (много глюков бывает из-за того что одно и то же устройстве выдает один и тот же токен после переустановок приложения)

Answered by Serge Markov on January 4, 2022

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP