我正在从Firebase向我的Android应用程序发送推送通知。但是,当我的应用程序处于后台firebase时,不会调用onMessageReceived方法,firebase会将通知发送给系统以在系统任务栏中显示通知。通知出现在系统托盘中,但是没有声音发出通知,即使我在系统设置中允许我的应用程序发出通知声音。
从Firebase收到通知时我该怎么做以播放通知声音。
这就是我从Firebase向我的应用程序Blogpost链接发送通知的方式。
我正在从Firebase向我的Android应用程序发送推送通知。但是,当我的应用程序处于后台firebase时,不会调用onMessageReceived方法,firebase会将通知发送给系统以在系统任务栏中显示通知。通知出现在系统托盘中,但是没有声音发出通知,即使我在系统设置中允许我的应用程序发出通知声音。
从Firebase收到通知时我该怎么做以播放通知声音。
这就是我从Firebase向我的应用程序Blogpost链接发送通知的方式。
Answers:
通知的通知有效负载中有一个声音键。
从官方文档中可以看到:
表示设备收到通知时播放的声音。支持默认或应用程序中捆绑的声音资源的文件名。声音文件必须位于/ res / raw /中。
例如:
{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark",
"icon" : "myicon",
"sound" : "mySound"
}
}
如果要使用设备的默认声音,则应使用:"sound": "default"
。
有关有效负载中所有可能的密钥的信息,请参见以下链接:https : //firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support
对于不了解Firebase的用户,当应用程序在后台运行时,它们对通知的处理方式会有所不同。在这种情况下,不会调用onMessageReceived函数。
当您的应用程序在后台运行时,Android会将通知消息定向到系统任务栏。默认情况下,用户点击通知会打开应用启动器。这包括同时包含通知和数据有效负载的消息。在这些情况下,通知将传递到设备的系统托盘,而数据有效载荷将在启动器活动的意图之外传递。
试试这个
{
"to" : "DEVICE-TOKEN",
"notification" : {
"body" : "NOTIFICATION BODY",
"title" : "NOTIFICATION TITILE",
"sound" : "default"
}
}
@note自定义通知声音:-> "sound" : "MyCustomeSound.wav"
的 onMessageReceived
仅当应用程序位于前台或通知有效负载仅包含数据类型时,才会触发方法。
对于下游消息传递,FCM提供两种类型的有效负载: 通知和数据。
对于通知类型,FCM代表客户端应用程序自动向最终用户设备显示消息。通知具有一组预定义的用户可见键。
对于数据类型,客户端应用负责处理数据消息。数据消息仅具有自定义键值对。当您希望FCM处理代表客户端应用程序显示的通知时,请使用通知。当您希望您的应用在Android客户端应用上处理显示或处理消息时,或者在直接FCM连接时将消息发送到iOS设备时,请使用数据消息。
深入文档
应用行为接收包含通知和数据有效载荷的消息时,取决于该应用程序是在后台还是在前台—本质上是在接收时是否处于活动状态。
在后台时,应用程序会在通知托盘中接收通知有效负载,并且仅在用户点击通知时处理数据有效负载。
在前台时,您的应用程序会收到一个消息对象,其中包含两个有效负载。
如果您使用Firebase控制台发送通知,则有效负载将始终包含通知类型。您必须使用Firebase API来发送仅包含通知有效负载中数据类型的通知。这样,当收到新通知时,始终会通知您的应用,并且该应用可以处理通知有效负载。
如果要使用常规方法在应用程序处于后台时播放通知声音,则需要将声音参数添加到通知有效负载中。
与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"
}
}
}
}
$this->message['message']['android']['notification']['sound'] = "default";
我还遇到了必须发出声音的通知的问题,当应用程序在前台运行时,一切正常运行,但是当应用程序在后台运行时,声音却没有发出。
通知是由服务器通过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 ...
}
在您的主要活动中:
@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);
}
}
这终于解决了我的问题,希望它可以帮助某人不要像我一样浪费2天的时间。我不知道我在代码中放入的所有内容是否必要,但这就是方法。我也没有找到github论坛链接来记下答案,因为我所做的与那里发布的内容相同。
像这样
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//codes..,.,,
Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
builder.setSound(sound);
}
试试这个....
public void buildPushNotification(Context ctx, String content, int icon, CharSequence text, boolean silent) {
Intent intent = new Intent(ctx, Activity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1410, intent, PendingIntent.FLAG_ONE_SHOT);
Bitmap bm = BitmapFactory.decodeResource(ctx.getResources(), //large drawable);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx)
.setSmallIcon(icon)
.setLargeIcon(bm)
.setContentTitle(content)
.setContentText(text)
.setAutoCancel(true)
.setContentIntent(pendingIntent);
if(!silent)
notificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1410, notificationBuilder.build());
}
并在onMessageReceived中调用它
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d("Msg", "Message received [" + remoteMessage.getNotification().getBody() + "]");
buildPushNotification(/*your param*/);
}
或按照KongJing进行操作,就像他所说的一样,但是您可以使用Firebase Console。
即使从Firebase控制台发送通知声音,我也可以播放。为此,您只需要在选项中添加键“ sound”和“ default”值即可。