我遇到了一个问题,Firebase 云消息传递会向模拟器(Android 7.0,安装了播放服务(发送通知,但不会发送到任何运行 Android 8+ 的设备(Google Pixel 2、Samsung s9+、Huawei MATE 10(。我最初认为这可能是关闭听众的省电问题,但即使我从应用程序中删除优化,它仍然没有通过。
我知道下游请求已成功发送,并且我正在从响应中收到状态代码200
(当然,因为模拟器上正在接收通知(。但是,在设备上调试时,无论是在前台还是后台,都不会调用我的FCMService
类中的onMessageReceived
。
它肯定已在清单中注册,并且每个设备都使用相同的应用程序版本:
<service android:name=".services.FCMService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
如果需要更多信息,请告诉我。提前谢谢。
为什么会这样?
当我在问题中输入版本号时,我意识到它与 Android Oreo 有关。我正在寻找 FCM 的问题,而不是通知工作方式的最新更改。在 Android 26+ 中,引入了通知渠道,如果您的应用面向 26 及以上版本(我是这样(,则需要通知渠道。因为我不假思索地更新了目标SDK,所以我当然没有收到通知。
如何修复它
最简单的方法是仅针对 API 25,但这并不理想。
您可以做的是注册通知通道。我已经在处理通知的地方这样做了(所以onMessageReceived
(,因为它不会多次注册同一个频道。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Set the default notification channel settings to be that of alert
int importance = NotificationManager.IMPORTANCE_HIGH;
String channel_id = ALERT_CHANNEL_ID;
CharSequence channel_name = ALERT_CHANNEL_NAME;
String channel_desc = ALERT_CHANNEL_DESC;
// Logic to change the channel id, name and desc if required
// Build and modify channel settings
NotificationChannel channel = new NotificationChannel(channel_id, channel_name, importance);
channel.setDescription(channel_desc);
channel.enableLights(true);
channel.enableVibration(true);
// Create the notification channel
notificationManager.createNotificationChannel(channel);
}
然后,您要更改通知生成器:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channel_id)