如何在Android 8中为FCM推送消息指定Android通知通道

如何在Android 8中为FCM推送消息指定Android通知通道,android,firebase-cloud-messaging,amazon-sns,notification-channel,Android,Firebase Cloud Messaging,Amazon Sns,Notification Channel,我们的应用程序现在有targetSdkVersion 26(Android 8),并且应用程序使用FCM推送通知 按照规定,我将FCM客户端库更新为11.2.0版: dependencies { compile 'com.google.firebase:firebase-messaging:11.2.0' } 通过此FCM客户端库更新,FCM通知开始出现在Android设备上。很好,但当应用程序在后台时,处理FCM消息的是系统,因此它使用名为“Miscellaneous”的默认And

我们的应用程序现在有
targetSdkVersion 26
(Android 8),并且应用程序使用FCM推送通知

按照规定,我将FCM客户端库更新为11.2.0版:

dependencies {
     compile 'com.google.firebase:firebase-messaging:11.2.0'
}
通过此FCM客户端库更新,FCM通知开始出现在Android设备上。很好,但当应用程序在后台时,处理FCM消息的是系统,因此它使用名为“Miscellaneous”的默认Android通知通道,这不是我们想要的(我们还有其他通知通道,“Miscellaneous”在列表中听起来很混乱)

如上所述,有一种方法可以为FCM消息指定默认通知通道:

(可选)在应用程序组件中,要设置的元数据元素 默认图标、颜色和通知通道(Android O中新增) 通知。无论何时收到消息,Android都会使用这些值 未明确设置图标、颜色或通知频道

但是,没有显示代码示例(仅显示图标和颜色的示例)。所以我通过谷歌搜索github上的一个示例发现:

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

但它不起作用-FCM通知仍显示在“杂项”频道中。我在日志中看到:

W/FirebaseMessaging:中缺少默认通知通道元数据 AndroidManifest。将使用默认值

当然,我试着重新安装这个应用程序。还有问题

理想情况下,应该有某种方法在发送消息时指定后端的通知通道。FCM开发控制台允许测试发送,现在在UI中有这样一个选项:

而且效果很好。然而,我们的后端使用Java Amazon SNS API,我不知道该API是否允许在发送消息时指定Android通知通道(因为这是Android的一项新功能,亚马逊需要时间来采用)。因此,在
AndroidManifest.xml
中设置默认通知通道目前是一个有效的解决方法,但它不起作用。

查看文档:

android\u channel\u id通知的频道id(android O中新增)

在发出任何通知之前,应用程序必须使用此ID创建频道 使用此密钥接收

如果您没有在请求中发送此密钥,或者如果 如果应用程序尚未创建,FCM将使用频道id 在应用程序清单中指定

尝试在即将发布到fcm的json中包含
android\u channel\u id
。我不知道为什么manifest value对您不起作用。尝试将频道添加到您的请求中,您将获得与Firebase控制台相同的效果

编辑:我刚刚意识到你要求亚马逊客户机集成。也许您可以手动构建json请求(对不起,我不太了解Amazon服务)。

FCM已迁移到:

android\u channel\u id
将导致错误请求:

"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
  {
    "field": "message.notification",
    "description": "Invalid JSON payload received. Unknown name \"android_channel_id\" at 'message.notification': Cannot find field."
  }
正确的有效载荷应为:

{
    "message": {
        "token": "{{deviceToken}}",
        "notification": {
            "body": "This is an FCM notification message hello 23",
            "title": "FCM Message",
            "image": "https://lumiere-a.akamaihd.net/v1/images/au_moviesshowcase_mulan_poster_r_2_54011055.jpeg?region=0,0,960,1420"
        },
        "android": {
          "notification": {
            "channel_id": "channel_id_1"
          }
        },
        "data": {
            "key1": "42",
            "key2": "sent by 21"
        }
    }
}

参见

非常感谢!我能够通过Amazon SNS控制台使用android_channel_idparam(只需将其添加到JSON负载中)。这甚至比AndroidManifest.xml中的默认通知通道更好,因此我不再为它为什么不起作用而烦恼了。:)如何创建android_频道?引用的链接指向标记为Legacy HTTP Server Protocol的部分,但主协议部分没有提到android_频道_id@VitKhudenko请问您在json文件中添加了什么内容?thanks@rosualin,android\u channel\u id参数,带有特定于我的应用程序的字符串id值。您是否创建了字符串值
默认通知\u channel\u id
?当然,我创建了。在您的帖子中,您写了“.default\u notification\u channel”,但它应该是“.default\u notification\u channel*\u id*”,仅供参考,@VitKhudenko但问题是当应用程序位于后台时,如果负载包含
通知
部分,则不会调用
onMessageReceived
,这意味着如果无论应用程序位于前台还是后台,都需要调用
onMessageReceived
,则无法将频道id放入负载中。我完全不知道如何让它们都工作。LolHey li2,我也有同样的情况。你或其他人让它工作了吗?@GuilhermeRamos你可以在
“data”
部分添加一个额外的键
“channel\u id”
,然后解析数据有效载荷
remoteMessage。在
onMessageReceived
回调上添加数据,然后你可以做任何你想做的事情。是的,没问题。但是应用程序不是“运行”的,而是在后台?经过几个小时的搜索终于工作了,谢谢,伙计:)
{
    "message": {
        "token": "{{deviceToken}}",
        "notification": {
            "body": "This is an FCM notification message hello 23",
            "title": "FCM Message",
            "image": "https://lumiere-a.akamaihd.net/v1/images/au_moviesshowcase_mulan_poster_r_2_54011055.jpeg?region=0,0,960,1420"
        },
        "android": {
          "notification": {
            "channel_id": "channel_id_1"
          }
        },
        "data": {
            "key1": "42",
            "key2": "sent by 21"
        }
    }
}