Уведомление об обмене сообщениями Firebase в облаке не получено устройством

У меня проблема с FireBase Cloud Messaging, когда я получаю токен с устройства и отправляю тест уведомления через консоль уведомлений Google Firebase, однако уведомление никогда не регистрируется и не отправляется на виртуальное устройство Android. Документация для FCM - это почти в точности тот код, который у меня есть ниже, и немного больше о том, что еще вам нужно сделать, чтобы получать push-уведомления, работающие с firebase. Я просмотрел всю информацию о настройке (дополнения build.gradle, установка сервисов Google Play и т. Д.), Как указано в документации, но до сих пор не генерирую сообщения. Я получаю одноразовую ошибку сразу после нажатия уведомления, в котором говорится: «I / FA: Диспетчер тегов не найден и поэтому не будет использоваться», но это единственные данные, которые выводятся, и я не нашел ничего, связанного с тегом. Требования к менеджеру и FCM в гуглах. Что не так с кодом, что я не получаю свои push-уведомления на logcat или на устройство? Пожалуйста, дайте мне знать любую дополнительную информацию, которая будет полезна. Спасибо.

NotificationGenie.java

public class NotificationGenie extends FirebaseMessagingService {

private static final String TAG = "Firebase_MSG";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
    sendNotification(remoteMessage.getNotification().getBody());
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
}

private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, PostLoginActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.tf2spyprofile)
            .setContentTitle("FCM Message")
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.test.movile_android">

<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".LoginActivity"
        android:label="@string/title_activity_login">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".DashBoardActivity"
        android:label="@string/title_activity_dash_board"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>

    <activity
        android:name=".NewOrderActivity"
        android:label="@string/title_activity_dash_board"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>

    <activity
        android:name=".PostLoginActivity"
        android:label="@string/title_activity_dash_board"
        android:theme="@style/AppTheme.NoActionBar">
    </activity>
</application>

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


person xec86    schedule 20.05.2016    source источник
comment
Сервисы Google Play не установлены на виртуальном устройстве. проверьте эту ссылку, если хотите узнать, как отправить уведомление с сервера codingaffairs.blogspot.com/2016/06/   -  person Developine    schedule 24.06.2016
comment
Вы можете посетить эту ветку. В нем есть четкое описание облачных сообщений firebase stackoverflow.com/questions/39046270/   -  person Md. Sajedul Karim    schedule 27.08.2016


Ответы (21)


Вы разместили свою службу вне тега приложения. Измените низ на это.

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

</application>
person Tristan Richard    schedule 20.05.2016
comment
Я не знаю, почему детали ‹intent-filter› не указаны во многих обучающих материалах. - person VSB; 14.10.2016
comment
это может быть потому что это не нужно сейчас - person Killer; 13.06.2017
comment
@tristan Я не понимаю, почему у меня такая же проблема, и моя служба все еще используется в приложении, как вы упомянули. Я думаю, что мой идентификатор устройства хранится на сервере firebase - person Prasad; 30.10.2019

«Вы также должны иметь в виду, что для получения сообщений, отправленных из Firebase Console, приложение должно находиться в фоновом режиме, не запускаться и не быть скрытым». --- Согласно комментарию @Laurent Russier.

Я не получал никаких сообщений от Firebase, пока не установил приложение в фоновом режиме.

Это верно только для USB-соединения для эмулятора, вы также получаете уведомление на переднем плане.

person Tosin Onikute    schedule 12.09.2016
comment
Мне нужно открыть приложение, а затем нажать кнопку «Домой»? - person JCarlosR; 24.10.2016
comment
Нет, вам нужно убедиться, что ваше приложение работает в фоновом режиме, чтобы получать уведомление с консоли. - person Tosin Onikute; 24.10.2016
comment
Вы можете протестировать с помощью pushtry.com проще, чем с помощью консоли Firebase. Вы также можете отправить собственный JSON. - person Arvind; 29.12.2016
comment
Спасибо @HtmlTosin! Это сработало и для меня в приложении, которое я перехожу с GCM на FCM. Однако, когда я тестировал следующий пример проекта, я мог отправлять push-уведомления через Firebase Console, даже когда приложение находится на переднем плане: github.com/ton1n8o/FCMTutorial Странно ... - person Marie Amida; 09.01.2017
comment
Я не выхожу на передний план даже после установки сборки приложения на телефон - person Zeeshan Ahmad Khalil; 26.07.2021

У меня была такая же проблема, и она решается путем определения включенного, экспортированного в true в моем сервисе

  <service
            android:name=".MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
person Hoby    schedule 29.08.2016
comment
Это сработало для меня. На самом деле я обнаружил, что получаю уведомления только тогда, когда мое приложение работает. Если бы я перезагрузил телефон, уведомления не приходили. Но после установки атрибутов enabled и exported push-уведомления теперь проходят нормально. Спасибо, Хоби! :-) - person ban-geoengineering; 06.09.2016
comment
Я думаю, что было бы неплохо добавить те же два атрибута и к вашей MyInstanceIDListenerService службе. - person ban-geoengineering; 06.09.2016
comment
Спасибо. Я много чего пробовал, но это решение. Вы знаете, почему это происходит? - person JCarlosR; 24.10.2016
comment
Не обязательно. Пробовал Firebase Sample Messaging Project - с включенным и экспортированным и без него - это чрезмерно. Помогло запустить и скрыть приложение, чтобы увидеть уведомление на верхней панели - см. Ответ Html Tosin. - person Zon; 12.07.2017
comment
В соответствии с документацией Android по умолчанию включен true, а экспортированный означает, что служба может быть вызвана компонентами, внешними по отношению к приложению. Не уверен, зачем это здесь нужно. developer.android.com/guide/topics/manifest/. - person Adi; 06.10.2019

Вызовите super.OnMessageReceived() в методе Overriden. Это сработало для меня! Наконец-то!

person Nikhil Setty    schedule 28.09.2016
comment
танки очень много это была моя проблема - person mostafa3dmax; 10.07.2020

Я столкнулся с той же проблемой облачных сообщений Firebase, которые не принимаются устройством.

В моем случае имя пакета, определенное в проекте консоли Firebase, отличалось от имени, определенного в манифесте и Gradle моего проекта Android.

В результате я получил токен правильно, но никаких сообщений не было.

Подводя итог, необходимо, чтобы имя пакета Firebase Console и Manifest & Gradle совпадали.

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

person Juan Pablo    schedule 24.05.2016
comment
Вы также должны иметь в виду, что для получения сообщений, отправленных из консоли Firebase, приложение должно быть в фоновом режиме, не запускаться и не быть скрытым. - person Laurent Russier; 07.07.2016
comment
Что вы имеете в виду, когда говорите, что не началось и не скрыто? - person Gilboot; 27.04.2020

Я столкнулся с той же проблемой, но в моем манифесте все еще был мусор из старого GCM. Когда я взял следующее разрешение из своего манифеста, он исправил ошибку. com.google.android.c2dm.permission.RECEIVE

person RSSV    schedule 09.06.2016


Если вы только что добавили FCM в существующее приложение, onTokenRefresh() НЕ будет вызываться. Я заставил его запустить, удалив приложение и установив его снова.

person Tash Pemhiwa    schedule 03.01.2017

В моем случае я заметил, что у mergedmanifest отсутствует приемник. Поэтому мне пришлось включить:

 <receiver
            android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
 </receiver>
person Irshu    schedule 17.05.2019
comment
Даже если я использую последнюю версию Firebase 18.0.0, я не получал уведомления. Но ваше решение сработало для меня. - person AKASH WANGALWAR; 12.06.2019
comment
Я думал, что FirebaseInstanceIdService обесценилась. Что это за ресивер - person Dr Deo; 05.04.2020

В моем случае я просто включаю Wi-Fi и мобильные данные в эмуляторе, и это работает как шарм. потому что я не могу отправлять комментарии, оставьте ответ. Удачи

person vahid sabet    schedule 11.05.2020

Потратив несколько часов на эту проблему, я, наконец, осознал проблему, когда намеренно испортил формат файла google-services.json, и моя сборка все еще была успешной. Компилятор не замечает изменений в этом файле. Я пробовал много вещей, перезагрузил с диска, Gradle задачу cleanBuildCache, новое виртуальное устройство, удалил / переустановил приложение и т. Д., Но ничего не сработало.

Для меня решение было в AndroidStudio -> Build -> Clean Project и Build -> Rebuild Project

PS: Также убедитесь, что google-services.json находится в папке приложения.

person Caner    schedule 02.02.2021

Вам необходимо следовать нижеприведенному коду манифеста (в манифесте должна быть служба)

 <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="soapusingretrofitvolley.firebase">
        <uses-permission android:name="android.permission.INTERNET"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <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>

    </manifest>
person Nilesh    schedule 24.09.2016
comment
Ошибка: нерешенный класс MyFirebaseInstanceIDService - person Gilboot; 27.04.2020

Когда вы копируете токен своего устройства, он может копировать пространство, дважды проверьте, что вы скопировали правильный токен

person Sam    schedule 01.08.2017

Я проработал весь этот пост и другие, а также обучающие видеоролики, но не смог решить свою проблему с неполучением сообщений, однако регистрационный токен работал.

До этого я тестировал приложение только на эмуляторе. После тестирования на физическом телефоне он сразу заработал без каких-либо предварительных изменений в проекте.

person Jens    schedule 08.07.2018

У меня была такая проблема, я проверил свой код. Я попытался исправить все, что здесь было сказано. в конце концов проблема была такой глупой. Sync моего устройства был выключен. это была единственная причина, по которой я не получал уведомления, как ожидалось.

введите здесь описание изображения

person Soorena    schedule 11.08.2018
comment
Это странно. Так же отключаю синхронизацию, даже в гугле не авторизуюсь. Раньше все работало, почти ничего не менял, а теперь не подключается. Будем искать дальше. - person CoolMind; 16.10.2019

Если вы хотите, чтобы ваше приложение работало в более чем 24 версиях, выполните следующие действия:

1. Добавьте это в свой strings.xml

‹String name =" default_notification_channel_id "translatable =" false "> fcm_default_channel

  1. Добавьте эти метаданные в свой файл манифеста:

‹Метаданные android: name =" com.google.firebase.messaging.default_notification_channel_id "android: value =" @ string / default_notification_channel_id "/>

3. для создания уведомлений (с изображениями) используйте этот метод там, где вы обрабатываете уведомления, если напрямую затем добавьте в службу обмена сообщениями firebase или если вы используете какой-либо класс util, добавьте в этот класс util:

   @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    public static void createBigNotification(Bitmap bitmap, int icon, String message, Uri alarmSound) {
        final int NOTIFY_ID = 0; // ID of notification
        NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
        String id = mContext.getString(R.string.default_notification_channel_id); // default_channel_id
        String title = mContext.getString(R.string.app_name);
        Intent intent;
        NotificationCompat.Builder builder;
        if (notificationManager == null) {
            notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        }
        PendingIntent resultPendingIntent;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel mChannel = notificationManager.getNotificationChannel(id);
            if (mChannel == null) {
                mChannel = new NotificationChannel(id, title, importance);
                mChannel.enableVibration(true);
                mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
                notificationManager.createNotificationChannel(mChannel);
            }
            builder = new NotificationCompat.Builder(mContext, id);
            intent = new Intent(mContext, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            resultPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
            NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
            bigPictureStyle.setBigContentTitle(title);
            bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
            bigPictureStyle.bigPicture(bitmap);

            builder.setContentTitle(title)        // required
                    .setSmallIcon(R.drawable.app_icon)   // required
                    .setContentText(message) // required
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true)
                    .setSound(alarmSound)
                    .setStyle(bigPictureStyle)
                    .setContentIntent(resultPendingIntent)
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
                    .setTicker(title)
                    .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        } else {
            builder = new NotificationCompat.Builder(mContext, id);
            intent = new Intent(mContext, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            resultPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
            NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
            bigPictureStyle.setBigContentTitle(title);
            bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
            bigPictureStyle.bigPicture(bitmap);

            builder.setContentTitle(title)     // required
                    .setSmallIcon(R.drawable.app_icon)   // required
                    .setContentText(message) // required
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true)
                    .setSound(alarmSound)
                    .setStyle(bigPictureStyle)
                    .setContentIntent(resultPendingIntent)
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
                    .setTicker(title)
                    .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
                    .setPriority(Notification.PRIORITY_HIGH);
        }
        Notification notification = builder.build();
        notificationManager.notify(NOTIFY_ID, notification);
    }

Выполните следующие действия, и ваше уведомление появится в панели уведомлений.

person amit pandya    schedule 10.04.2019
comment
Откуда вы поместили метод createBigNotification и откуда вы его вызываете? - person Gilboot; 27.04.2020
comment
@Ssenyonjo, вы можете добавить его в свой широковещательный приемник или в файл Activity / Fragment, к которому вы будете получать глобальный доступ в приложении. - person amit pandya; 28.04.2020

В моем случае я вручную убил некоторые сервисы Google Play и забыл об этом.

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

person dante    schedule 04.03.2020

У меня возникла странная проблема, и я не мог понять, почему я не могу получить FCM, если он работает, но затем я немного изменил xml. И я понял, почему не работает.

Я изменил это:

<service
            android:name=".Service.MyFirebaseMessagingService"
>
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

К этому:

<service
            android:name=".Service.MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

Место, где был помещен >, вызывало некоторые проблемы, поэтому я закрыл тег в одной строке.

person Alejandro H    schedule 28.03.2021
comment
Пожалуйста, не ставьте палец вниз без причины. Я не просто придумал это, это реальная проблема, которую я имел, и исправил формат xml, который решил проблему невозможности получать уведомления. Якорные теги и формат кода - это нечто важное, о чем многие люди не знают, что на самом деле может вызвать реальные проблемы не только в xml, но и в коде реакции. - person Alejandro H; 04.04.2021

возможно, это из-за соединения, я изменил соединение с Ethernet на беспроводное, и оно работало, ничего не делая

person user7956268    schedule 03.05.2017

person    schedule
comment
когда мне ясно, что мое недавнее уведомление не пришло, пожалуйста, помогите мне, как я могу исправить эту проблему, и когда я отключаюсь от режима отладки USB, мой контекст уведомления телефона не отображается - person Ashish Shahi; 20.04.2017

person    schedule
comment
Ошибка: нерешенный класс MyFirebaseInstanceIDService - person Gilboot; 27.04.2020
comment
Вам необходимо создать Class MyFirebaseInstanceIDService для Firebase Service - person puspak saha; 25.11.2020