78

我在使用 FireBase Cloud Messaging 时遇到问题,我从设备获取令牌并通过 Google Firebase 通知控制台发送通知测试,但是,通知从未被记录或推送到 android 虚拟设备。FCM 的文档几乎就是我在下面的代码,而在使用 firebase 时,您还需要做些什么来获得推送通知。我已经完成了文档中指定的所有设置信息(build.gradle 添加、安装 google play 服务等),但仍然没有生成消息。在推送“I/FA:未找到跟踪代码管理器,因此不会使用”的通知后,我确实收到了一次性错误 但这是唯一输出的数据,我在谷歌上没有找到任何与跟踪代码管理器要求和 FCM 相关的内容。我没有收到到 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>

4

21 回答 21

66

“您还必须记住,要接收从 Firebase 控制台发送的消息,应用程序必须在后台,不能启动也不能隐藏。” --- 根据@Laurent Russier 的评论。

在我将我的应用程序置于后台之前,我从未收到任何来自 Firebase 的消息。

这仅适用于模拟器的 USB 连接,您也会在前台收到通知

于 2016-09-12T11:24:04.017 回答
60

您已将服务放置在应用程序标签之外。将底部更改为此。

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

</application>
于 2016-05-20T17:04:27.533 回答
43

我有同样的问题,它通过在我的服务中定义启用,导出为 true 来解决

  <service
            android:name=".MyFirebaseMessagingService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
于 2016-08-29T00:58:00.003 回答
14

调用super.OnMessageReceived()Overriden 方法。这对我有用!最后!

于 2016-09-28T21:49:32.237 回答
9

我遇到了设备未收到 Firebase 云消息的相同问题。

在我的情况下,在 Firebase 控制台项目上定义的包名称与在我的 Android 项目的 Manifest 和 Gradle 上定义的包名称不同。

结果我正确收到了令牌,但根本没有消息。

总而言之,Firebase 控制台包名称和 Manifest & Gradle 必须匹配。

您还必须记住,要接收从 Firebase 控制台发送的消息,应用程序必须在后台,既不启动也不隐藏。

于 2016-05-24T19:26:23.277 回答
8

我遇到了类似的问题,但在我的情况下,我的 Gradle 构建中缺少google-services插件(我正在将 Firebase 添加到现有项目中)。

我将以下内容添加到我的根目录build.gradle

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

以下是我的app-level结尾build.gradle

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

然后,我必须从 Firebase 控制台下载google-services.json文件(最初导入了现有的 Google Cloud 项目)并将其复制到我的app目录中。

于 2016-06-03T12:10:41.930 回答
8

我遇到了同样的问题,但我的清单中仍然有一些旧 GCM 的碎片。当我从清单中获得以下许可时,它修复了错误。com.google.android.c2dm.permission.RECEIVE

于 2016-06-09T18:47:38.760 回答
6

如果您刚刚将 FCM 添加到现有应用程序,onTokenRefresh()将不会被调用。我通过卸载应用程序并再次安装它来运行它。

于 2017-01-03T12:05:24.527 回答
6

就我而言,我注意到 mergemanifest 缺少接收器。所以我必须包括:

 <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>
于 2019-05-17T07:37:20.570 回答
4

在这个问题上花了几个小时后,当我故意破坏“google-services.json”的格式并且我的构建仍然成功时,我终于意识到了这个问题。我的 IDE(AndroidStudio) 没有注意到此文件中的更改。我尝试了很多东西,“从磁盘重新加载”、gradle 任务“cleanBuildCache”、新的虚拟设备、卸载/重新安装应用程序等,但都没有奏效。

AndroidStudio -> Build -> Clean Project对我来说,解决方案是Build -> Rebuild Project

PS:还要确保“google-services.json”在“app”文件夹中。

于 2021-02-02T12:39:26.460 回答
3

就我而言,我只是在模拟器中打开了 WiFi 和移动数据,它就像一个魅力。

于 2020-05-11T05:37:16.847 回答
1

您需要遵循以下清单代码(清单中必须有服务)

 <?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>
于 2016-09-24T06:17:06.190 回答
1

当您复制设备令牌时,它可能会复制空间,请仔细检查您是否复制了正确的令牌

于 2017-08-01T03:33:35.290 回答
0

我一直在研究整个帖子和其他帖子以及教程视频,但无法解决我没有收到消息的问题,但是注册令牌有效。

在那之前,我只是在模拟器上测试应用程序。在物理电话上试用后,它立即工作,无需事先对项目进行任何更改。

于 2018-07-08T13:27:35.267 回答
0

我遇到了这个问题,我检查了我的代码。我试图修复这里提到的所有内容。最后这个问题太愚蠢了。我的设备Sync关机了。这是我没有按预期收到通知的唯一原因。

在此处输入图像描述

于 2018-08-11T10:52:45.877 回答
0

就好像您希望您的应用程序也可以在 > 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.for创建通知(带图像)在您处理通知的地方使用此方法,如果直接添加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);
    }

按照这些步骤操作,您的通知将出现在通知托盘中。

于 2019-04-10T20:34:59.153 回答
0

我按照firebase网站上的所有步骤设置了Android APP的发送通知。我尝试了很多次,但无论是在美德设备还是物理设备上,我都无法收到通知。在我更改了美德设备和物理设备中的一些设置(设置部分中关于接收通知的那些设置)后,虚拟设备和物理设备都开始接收通知。

于 2021-12-23T21:03:37.870 回答
-1
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());
于 2016-11-23T09:59:52.613 回答
-1
    <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>
于 2018-01-19T15:33:32.113 回答
-1

就我而言,我手动杀死了一些谷歌播放服务并忘记了它。

稍后,我必须重新启动设备,之后我才能收到通知而没有任何问题。

于 2020-03-04T15:00:19.867 回答
-2

也许是因为连接我将连接从以太网更改为无线,它没有做任何其他事情就可以工作

于 2017-05-03T08:10:30.150 回答