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

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

У меня возникла проблема с облачными сообщениями FireBase, в которых я получаю токен с устройства и отправляю тест уведомления через консоль уведомлений Google Firebase, однако уведомление никогда не регистрируется и не выводится на виртуальное устройство Android. Документация для FCM - это почти тот код, который у меня ниже, и еще немного, что вам еще нужно сделать, чтобы получать push-уведомления, работающие с firebase. Я просмотрел всю информацию о настройке (дополнения build.gradle, Установка сервисов Google Play и т.д.), Как указано в документации, но до сих пор не генерируются сообщения. Я получаю одноразовую ошибку сразу же после нажатия уведомления, в котором говорится, что "I/FA: Диспетчер тегов не найден и, следовательно, не будет использоваться", но это единственные данные, которые выводятся, и я не нашел ничего, связанного с тегом Требования к диспетчеру и FCM в googles. Что не так с кодом, что я не получаю 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 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>

4b9b3361

Ответ 1

Вы разместили свой сервис внутри <application> </application>. Измени дно на это.

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

</application>

Ответ 2

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

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

Ответ 3

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

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

Это верно только при подключении usb для эмулятора, вы получаете уведомление на переднем плане, а также

Ответ 4

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

Ответ 5

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

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

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

Чтобы суммировать, необходимо, чтобы имена пакетов Firebase Console и Manifest и Gradle совпадали.

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

Ответ 6

У меня была аналогичная проблема, но в моем случае я отсутствовал google-services плагин из моей сборки Gradle (я был добавив Firebase в существующий проект).

Я добавил в свой корень build.gradle следующее:

classpath 'com.google.gms:google-services:3.1.0'

и следующее в конце моего app -level build.gradle:

apply plugin: 'com.google.gms.google-services'

Затем мне пришлось загрузить файл google-services.json из Firebase Console (изначально импортировавшего существующий проект Google Cloud) и скопировать его в мой каталог app.

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

    <activity android:name=".activity.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <!-- Firebase Notifications -->
    <service android:name=".service.MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

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

Ответ 11

В моем случае я заметил, что в 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>

Ответ 12

private void sendNotification(String message) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    int requestCode = 0;
    PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_ONE_SHOT);
    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.URI_COLUMN_INDEX);
    NotificationCompat.Builder noBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentText(message)
            .setColor(getResources().getColor(R.color.colorPrimaryDark))
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("FCM Message")
            .setContentText("hello").setLargeIcon(((BitmapDrawable) getResources().getDrawable(R.drawable.dog)).getBitmap())
            .setStyle(new NotificationCompat.BigPictureStyle()
                    .bigPicture(((BitmapDrawable) getResources().getDrawable(R.drawable.dog)).getBitmap()))
            .setAutoCancel(true)
            .setSound(sound)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0, noBuilder.build());

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

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

<string name = "default_notification_channel_id" transhable = "false"> fcm_default_channel

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

<meta-data android: name = "com.google.firebase.messaging.default_notification_channel_id" android: value = "@string/default_notification_channel_id"/>

3. для создания уведомлений (с изображениями) используйте этот метод, где вы обрабатываете уведомления, если напрямую, затем добавьте в службу firebasemessaging или если вы используете некоторый класс 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);
    }

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

Ответ 16

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

enter image description here

Ответ 17

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