在Android中从Firebase发送通知时没有通知声音


81

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

从Firebase收到通知时我该怎么做以播放通知声音。

这就是我从Firebase向我的应用程序Blogpost链接发送通知的方式。

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


1
请参考此答案..
geekoraul

大家好,我的问题已经解决。阅读这篇文章以了解详细信息。developine.com/…–
Developine

确保检查该应用程序的通知设置
maheshmnj

Answers:


113

通知的通知有效负载中有一个声音键。

从官方文档中可以看到:

表示设备收到通知时播放的声音。支持默认或应用程序中捆绑的声音资源的文件名。声音文件必须位于/ 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会将通知消息定向到系统任务栏。默认情况下,用户点击通知会打开应用启动器。这包括同时包含通知和数据有效负载的消息。在这些情况下,通知将传递到设备的系统托盘,而数据有效载荷将在启动器活动的意图之外传递。


23
如果要使用设备的默认声音,则应使用:“ sound”:“ default”
Brian Vo

@TranVo感谢您指出“默认”值播放设备的默认声音,您节省了很多时间!
Mattia Ruggiero

1
我尝试了所有可能的方法,但无法通过设置自己的音调获得默认声音或声音,也无法振动,这可能是原因
santhosh

1
那么如何禁用通知声音呢?
iamatsundere181 '18

1
新的Notification Channel系统是否已针对较旧的设备淘汰了该API,或者仍然适用于较旧的设备?我一直在尝试为Nougat设备显示自定义声音,但是无论我在“ sound”或“ soundName”中输入什么,我似乎都得到了默认的编钟声音效果。我已经尝试过“ mysoundeffect.wav”和“ mysoundeffect”,但是没有运气。
John Gorenfeld

26

适当的选择写信息时 选择高级选项,然后选择声音激活 选择激活

这是我的解决方案


在Android 8及更高版本中,@ KongJing始终会发出声音,无论Firebase控制台的设置如何。您知道完全防止声音的方法吗?
两次编码两次,

很抱歉看到这么晚,我无法解决这个问题。@一次思考两次代码
KongJing

22

试试这个

{
    "to" : "DEVICE-TOKEN",

    "notification" : {
      "body"  : "NOTIFICATION BODY",
      "title" : "NOTIFICATION TITILE",
      "sound" : "default"
    }
  }

@note自定义通知声音:-> "sound" : "MyCustomeSound.wav"


1
那你把那个文件放在哪里呢?在生吗?资产?
Hamzeh Soboh,

3
不是资产文件夹,在res下创建一个新文件夹,将其命名为raw。然后将您的wav或mp3文件复制并粘贴到该文件夹​​中。@HamzehSoboh
Ally Makongo

12

onMessageReceived仅当应用程序位于前台或通知有效负载仅包含数据类型时,才会触发方法。

Firebase文档

对于下游消息传递,FCM提供两种类型的有效负载: 通知数据

对于通知类型,FCM代表客户端应用程序自动向最终用户设备显示消息。通知具有一组预定义的用户可见键。
对于数据类型,客户端应用负责处理数据消息。数据消息仅具有自定义键值对。

当您希望FCM处理代表客户端应用程序显示的通知时,请使用通知。当您希望您的应用在Android客户端应用上处理显示或处理消息时,或者在直接FCM连接时将消息发送到iOS设备时,请使用数据消息。

深入文档

应用行为接收包含通知和数据有效载荷的消息时,取决于该应用程序是在后台还是在前台—本质上是在接收时是否处于活动状态。
在后台时,应用程序会在通知托盘中接收通知有效负载,并且仅在用户点击通知时处理数据有效负载。
在前台时,您的应用程序会收到一个消息对象,其中包含两个有效负载。

如果您使用Firebase控制台发送通知,则有效负载将始终包含通知类型。您必须使用Firebase API来发送仅包含通知有效负载中数据类型的通知。这样,当收到新通知时,始终会通知您的应用,并且该应用可以处理通知有效负载。

如果要使用常规方法在应用程序处于后台时播放通知声音,则需要将声音参数添加到通知有效负载中。


不,在关闭应用程序时也会调用它,但是您应该允许应用程序自动启动。
时髦的

10

与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"
       }
    }
  }
}

如何用php写这个?
塔比汗

@Tabishkhan$this->message['message']['android']['notification']['sound'] = "default";
SudoPlz

5

我还遇到了必须发出声音的通知的问题,当应用程序在前台运行时,一切正常运行,但是当应用程序在后台运行时,声音却没有发出。

通知是由服务器通过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论坛链接来记下答案,因为我所做的与那里发布的内容相同。


2

像这样

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

    Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        builder.setSound(sound);

}

6
当应用程序在后台运行时,不会调用onMessageReceived。实际上,这是我面临的问题
Developine

您是否从主要活动中调用了此(Firebase.setAndroidContext(getApplicationContext());)
AAA

不,我没有。但是现在我正在播放isl的通知答案对我有用。
Developine

请告诉我生成器生成错误,请定义生成器
Ashish Shahi

生成器是notificationcompat生成器
AAA

1

试试这个....

  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。


0

即使从Firebase控制台发送通知声音,我也可以播放。为此,您只需要在选项中添加键“ sound”和“ default”值即可。


您的想法是可行的,但当电话被锁定时,我需要更改通知图像。我该如何更改,请帮助我
Ashish Shahi

我尝试过您以前的想法,但不起作用,请帮助它太紧急
Ashish Shahi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.