从android中的firebase发送通知时没有通知声音

Dev*_*ine 63 notifications android push-notification firebase firebase-cloud-messaging

我正在从firebase向我的Android应用程序发送推送通知.但是当我的应用程序处于后台时,不会调用firebase onMessageReceived方法而是调用firebase向系统发送通知,以便在系统托盘中显示通知.通知出现在系统托盘中但没有通知声音,即使我已在系统设置中允许我的应用程序发出通知声音.

当从firebase收到通知时,我可以做什么来播放通知声音.

这就是我从firebase向我的应用Blogpost链接发送通知的方式.

如何在Android应用程序中添加firebase

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会将通知消息定向到系统托盘.用户点按通知会默认打开应用启动器.这包括包含通知和数据有效负载的消息.在这些情况下,通知将传递到设备的系统托盘,并且数据有效负载将在启动器活动的附加内容中传递.

  • 如果你想使用设备的默认声音,你应该使用:"声音":"默认" (16认同)
  • 那么如何才能关闭通知声音呢? (2认同)
  • 新的通知通道系统是否已针对旧设备废弃了此 API,或者它仍然适用于旧设备?我一直在尝试为牛轧糖设备显示自定义声音,但无论我在“声音”或“声音名称”中输入什么,我似乎都会获得默认的铃声效果。我尝试过“mysoundeffect.wav”和“mysoundeffect”但没有成功。 (2认同)

小智 22

adavaced选项编写消息时 选择高级选项,然后选择声音激活 选择激活

这是我的解决方案


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"

  • 我已经做到了,但是没有用 (5认同)
  • 那么你将该文件放在哪里?原始的?资产? (4认同)
  • 不是资源文件夹,在res下创建一个新文件夹,称之为raw.然后将您的wav或mp3文件复制并粘贴到该文件夹​​.@HamzehSoboh (2认同)
  • 我将声音放入 Android 应用程序中的 /res/raw/my_sound.mp3 中,然后使用“sound”:“my_sound.mp3”调用 API。不起作用,只播放默认声音:( 有人像我一样吗? (2认同)

Ana*_*afi 10

您需要确保您的系统为您的应用程序启用声音通知,某些设备(例如小米)默认禁用此选项,因此您将不会听到通知声音,直到您转到:

设置 > 通知 >(搜索您的应用程序并单击其名称)...

然后启用(允许声音)选项如图所示:

在此输入图像描述


Ren*_*ith 9

onMessageReceived仅当app位于前台或通知有效内容仅包含数据类型时才会触发该方法.

来自Firebase文档

对于下游消息传递,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 论坛链接来证明答案,因为我所做的与发布在那里的相同。


And*_*rey 6

与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)

  • @Scilef 请参阅:https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages。iOS 中与“android”对应的成员是“apns”。在“apns”内部,您需要一个“payload”成员,在其中您需要一个“aps”成员,该成员对应于 iOS 的常用 aps 有效负载,如下所示:https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/生成_a_remote_notification?语言= objc (2认同)