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


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

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

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

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


44
2018-06-22 05:52


起源


请参阅 这个答案.. - geekoraul
非常感谢。我明白。 - Hammad Tariq
大家好,我的问题已经解决了。阅读这篇文章了解详情。 developine.com/... - Hammad Tariq


答案:


在通知的通知有效载荷中,存在声音键。

从官方文档中可以看出:

表示设备收到通知时播放的声音。   支持默认或捆绑在一起的声音资源的文件名   应用程序。声音文件必须位于/ 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会指示通知   消息到系统托盘。用户点击通知即可打开   应用程序启动器默认情况下。这包括包含两者的消息   通知和数据有效负载。在这些情况下,通知是   传送到设备的系统托盘,数据有效负载是   在您的启动器活动的意图的额外提供。


70
2018-06-22 06:08



如果你想使用设备的默认声音,你应该使用:“声音”:“默认” - TranVo
@TranVo感谢指出“默认”值播放设备的默认声音,你节省了我很多时间! - Mattia Ruggiero
在通知中我得到响应哪个屏幕重定向键如果应用程序在前台和点击通知工作正常如果在背景通知点击打开启动器活动onMessageReceived如何处理请帮助我的背景和前景处理 - Harsha
我尝试了所有可能的方法但是不能通过设置我自己的音调来获得默认的声音或声音,也没有得到振动可能是什么原因 - santhosh
工作得很好...... - Addi.Star


adavaced options 选择 高级选项 什么时候 写一个信息,并选择声音 活性 choose activated

这是我的解决方案


18
2018-06-01 09:44



是的,它的工作。默认情况下,它已被禁用。 - Neela


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

来自 Firebase文档

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

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

使用通知 当你想要的时候 FCM来处理 显示一个   代表您的客户端应用程序发送通知。 使用数据 你的消息   想要你的 应用程序来处理 显示或处理您的消息   Android客户端应用,或者如果要向iOS设备发送消息   当有直接的FCM连接时。

再往下走了 文档

应用行为 在接收包含两个通知的消息时   和数据有效负载取决于应用程序是在后台还是   前景 - 基本上,它是否在当时是活跃的   收据。
在后台,apps接收通知有效负载   在通知托盘中,只处理数据有效负载时   用户点击通知。
在前台时,您的应用会收到两个有效负载的消息对象。

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

如果您想使用传统方法在应用程序处于后台时播放通知声音,则需要 添加声音参数 到通知有效载荷。


7
2018-06-22 06:14



很好的解释。谢谢 - Hammad Tariq
不,它也会在应用程序关闭时调用,但你应该允许自动启动应用程序。 - funky-nd


你可以这样

{
    "to" : "DEVICE-TOKEN",

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

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


5
2017-10-27 20:31



那么你把文件放在哪里?在原始?资产? - Hamzeh Soboh
不是资源文件夹,在res下创建一个新文件夹,称之为raw。然后将您的wav或mp3文件复制并粘贴到该文件夹​​。 @HamzehSoboh - Ally Makongo


这样做

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

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

}

3
2018-06-22 06:08



当app在后台时,不会调用onMessageReceived。实际上这是我面临的问题 - Hammad Tariq
你从主要活动中调用了这个(Firebase.setAndroidContext(getApplicationContext());)吗? - AAA
不,我没有。但现在我正在播放来自isl的通知回答。 - Hammad Tariq
运作良好与否?如果运作良好然后享受:) - AAA
是的工作:) thankyou :) - Hammad Tariq


即使我从firebase控制台发送它,我也可以播放通知声音。要做到这一点,您只需要在事先选项中添加值“default”的关键“声音”。


0
2018-01-27 16:34



你的想法是有效的但我需要在手机锁定时更改通知图像我如何更改请帮助我 - Ashish Shahi
我试试你以前的想法,但不工作请帮助它是如此迫切 - Ashish Shahi


尝试这个....

  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*/);
}

或者跟随 孔经理,他说也是正确的,但您可以使用Firebase控制台。


0
2017-08-08 18:35





使用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"
       }
    }
  }
}

0
2018-04-19 22:13