Dev*_*ine 63 notifications android push-notification firebase firebase-cloud-messaging
我正在从firebase向我的Android应用程序发送推送通知.但是当我的应用程序处于后台时,不会调用firebase onMessageReceived方法而是调用firebase向系统发送通知,以便在系统托盘中显示通知.通知出现在系统托盘中但没有通知声音,即使我已在系统设置中允许我的应用程序发出通知声音.
当从firebase收到通知时,我可以做什么来播放通知声音.
这就是我从firebase向我的应用Blogpost链接发送通知的方式.
Isj*_*Isj 87
在通知的通知有效载荷中,存在声音密钥.
从官方文档中可以看出:
表示设备收到通知时播放的声音.支持默认或应用程序中捆绑的声音资源的文件名.声音文件必须位于/ res/raw /中.
例如:
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon",
"sound" : "mySound"
}
}
Run Code Online (Sandbox Code Playgroud)
如果要使用设备的默认声音,则应使用:"sound": "default".
请参阅此链接,了解有效负载中的所有可能密钥:https: //firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
对于那些不知道的人,当应用程序处于后台时,firebase会以不同的方式处理通知.在这种情况下,不会调用onMessageReceived函数.
当您的应用在后台时,Android会将通知消息定向到系统托盘.用户点按通知会默认打开应用启动器.这包括包含通知和数据有效负载的消息.在这些情况下,通知将传递到设备的系统托盘,并且数据有效负载将在启动器活动的附加内容中传递.
Sam*_*eer 16
你可以这样
{
"to" : "DEVICE-TOKEN",
"notification" : {
"body" : "NOTIFICATION BODY",
"title" : "NOTIFICATION TITILE",
"sound" : "default"
}
}
Run Code Online (Sandbox Code Playgroud)
@note用于自定义通知声音: - > "sound" : "MyCustomeSound.wav"
Ana*_*afi 10
您需要确保您的系统为您的应用程序启用声音通知,某些设备(例如小米)默认禁用此选项,因此您将不会听到通知声音,直到您转到:
设置 > 通知 >(搜索您的应用程序并单击其名称)...
然后启用(允许声音)选项如图所示:
onMessageReceived仅当app位于前台或通知有效内容仅包含数据类型时才会触发该方法.
对于下游消息传递,FCM提供两种类型的有效负载: 通知和数据.
对于通知类型,FCM会代表客户端应用自动向最终用户设备显示消息.通知具有一组预定义的用户可见键.
对于数据类型,客户端应用程序负责处理数据消息.数据消息只有自定义键值对.当您希望FCM处理代表客户端应用程序显示通知时使用通知.当您希望应用程序处理显示或处理Android客户端应用程序上的消息时,或者如果您希望在存在直接FCM连接时向iOS设备发送消息,请使用数据消息.
进一步下来的文档
接收包含通知和数据有效负载的消息时的应用程序行为取决于应用程序是在后台还是前台 - 实质上是否在接收时是否处于活动状态.
在后台,应用程序在通知托盘中接收通知有效负载,并仅在用户点击通知时处理数据有效负载.
在前台时,您的应用会收到一个消息对象,其中包含两个可用的有效负载.
如果使用firebase控制台发送通知,则有效内容将始终包含通知类型.您必须使用Firebase API仅在通知有效内容中发送包含数据类型的通知.这样,当收到新通知并且应用可以处理通知有效负载时,您的应用始终会收到通知.
如果您想使用传统方法在应用程序处于后台时播放通知声音,则需要将声音参数添加到通知有效内容中.
小智 9
我也遇到了必须发出声音的通知问题,当应用程序在前台时一切正常,但是当应用程序在后台时,声音就没有出来。
通知由服务器通过 FCM 发送,即服务器挂载通知的 JSON 并将其发送给 FCM,然后由 FCM 将通知发送给应用程序。即使我放了声音标签,声音也不会在背景中出现。
即使把声音标签它也不起作用。
经过如此多的搜索,我在 github 论坛上找到了解决方案。然后我注意到我的情况有两个问题:
1 - 缺少发送 channel_id 标签,这对于在 API 级别 26+ 中工作很重要
2 - 在 Android 应用程序中,对于这种直接从服务器发送通知的特定情况,我必须提前配置通道 ID,因此在我的主活动中,我必须配置通道,以便 Android 知道何时该做什么通知到了。
在服务器发送的 JSON 中:
{
"title": string,
"body": string,
"icon": string,
"color": string,
"sound": mysound,
"channel_id": videocall,
//More stuff here ...
}
Run Code Online (Sandbox Code Playgroud)
在您的主要活动中:
@Background
void createChannel(){
Uri sound = Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.app_note_call);
NotificationChannel mChannel;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mChannel = new NotificationChannel("videocall", "VIDEO CALL", NotificationManager.IMPORTANCE_HIGH);
mChannel.setLightColor(Color.GRAY);
mChannel.enableLights(true);
mChannel.setDescription("VIDEO CALL");
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build();
mChannel.setSound(sound, audioAttributes);
NotificationManager notificationManager =
(NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(mChannel);
}
}
Run Code Online (Sandbox Code Playgroud)
这终于解决了我的问题,我希望它可以帮助人们不要像我一样浪费 2 天。我不知道我在代码中输入的所有内容是否都需要,但就是这样。我也没有找到 github 论坛链接来证明答案,因为我所做的与发布在那里的相同。
与HTTP v1 API有所不同
例:
{
"message":{
"topic":"news",
"notification":{
"body":"Very good news",
"title":"Good news"
},
"android":{
"notification":{
"body":"Very good news",
"title":"Good news",
"sound":"default"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)