【问题标题】:No notification sound when sending notification from firebase in android从android中的firebase发送通知时没有通知声音
【发布时间】:2016-10-23 21:31:47
【问题描述】:

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

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

这就是我从 firebase 向我的应用 Blogpost link 发送通知的方式。

How to Add firebase in your Android Application

【问题讨论】:

  • 请参考this answer..
  • 确保检查该应用的通知设置

标签: android push-notification notifications firebase firebase-cloud-messaging


【解决方案1】:

在通知的通知载荷中有一个声音键。

从官方文档看它的用途是:

表示设备收到通知时要播放的声音。 支持默认或捆绑的声音资源的文件名 应用程序。声音文件必须位于 /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 会发送通知 消息到系统托盘。用户点击通知会打开 默认情况下应用启动器。这包括同时包含 通知和数据有效载荷。在这些情况下,通知是 传送到设备的系统托盘,并且数据有效负载是 在您的启动器 Activity 的意图的附加内容中交付。

【讨论】:

  • 如果你想使用设备的默认声音,你应该使用:"sound" : "default"
  • @TranVo 感谢您指出“默认”值播放设备的默认声音,您为我节省了很多时间!
  • 我尝试了所有可能的方法,但无法通过设置我自己的音调获得默认声音或声音,也没有振动可能是什么原因
  • 那么如何禁用通知的声音?
  • 新的通知通道系统是否已经淘汰了旧设备的此 API,或者它仍然适用于旧设备?我一直在尝试为 Nougat 设备显示自定义声音,但无论我在“声音”或“声音名称”中输入什么,我似乎都能获得默认的铃声效果。我试过“mysoundeffect.wav”和“mysoundeffect”但没有成功。
【解决方案2】:

这样做

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

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

}

【讨论】:

  • onMessageReceived 在应用程序处于后台时不会被调用。实际上这是我面临的问题
  • 你从主要活动中调用了这个(Firebase.setAndroidContext(getApplicationContext()); )
  • 不,我没有。但现在我正在播放来自 isl 的通知答案为我工作。
  • please tell me builder is generated error please define builder
  • builder 是 notificationcompat builder
【解决方案3】:

onMessageReceived 方法仅在应用程序处于前台或通知负载仅包含数据类型时触发。

来自Firebase docs

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

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

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

再往下docs

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

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

如果你想在应用程序在后台使用常规方法播放通知声音,你需要add the sound parameter到通知负载。

【讨论】:

  • 不,当应用程序关闭时也会调用它,但你应该允许应用程序自动启动。
【解决方案4】:

即使我从 Firebase 控制台发送通知声音,我也能播放它。为此,您只需要预先添加值为“default”的键“sound”选项。

【讨论】:

  • 你的想法是可行的,但我需要在手机锁定时更改通知图像我该如何更改请帮助我
  • 我正在尝试你以前的想法但不起作用请帮助它是如此紧急
【解决方案5】:

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

这是我的解决方案

【讨论】:

  • @KongJing 在 Android 8 及以上版本中,无论 Firebase 控制台设置如何,它始终有声音。你知道一种完全阻止声音的方法吗?
  • 很抱歉这么晚才看到,我无法解决这个问题。@Think Twice Code Once
【解决方案6】:

试试这个....

  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 控制台。

【讨论】:

    【解决方案7】:

    试试这个

    {
        "to" : "DEVICE-TOKEN",
    
        "notification" : {
          "body"  : "NOTIFICATION BODY",
          "title" : "NOTIFICATION TITILE",
          "sound" : "default"
        }
      }
    

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

    【讨论】:

    • 那么你把那个文件放在哪里了?生的?资产?
    • 不是assets文件夹,在res下新建一个文件夹,叫raw。然后将您的 wav 或 mp3 文件复制并粘贴到该文件夹​​中。 @HamzehSoboh
    • 我将声音放入 Android 应用程序的 /res/raw/my_sound.mp3 中,然后使用 "sound": "my_sound.mp3" 调用 API。不工作,只播放默认声音 :( 像我这样的人吗?
    • 哦,我成功了。使用 Android 通知通道,更多细节在这里:stackoverflow.com/questions/61142155/…
    【解决方案8】:

    HTTP v1 API 不同

    Documentation

    例子:

    {
     "message":{
        "topic":"news",
        "notification":{
           "body":"Very good news",
           "title":"Good news"
        },
        "android":{
           "notification":{
              "body":"Very good news",
              "title":"Good news",
              "sound":"default"
           }
        }
      }
    }
    

    【讨论】:

    【解决方案9】:

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

    通知是服务端通过FCM发送的,即服务端挂载通知的JSON发送给FCM,FCM再将通知发送给应用。即使我放了声音标签,声音也不会在背景中发出。

    即使放置声音标签也不起作用。

    经过大量搜索,我在 github 论坛上找到了解决方案。然后我注意到我的案例有两个问题:

    1 - 缺少发送 channel_id 标签,这对于在 API 级别 26+ 中工作很重要

    2 - 在 Android 应用程序中,对于这种直接从服务器发送通知的特定情况,我必须提前配置通道 ID,因此在我的主 Activity 中我必须配置通道以便 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 论坛链接来感谢答案,因为我所做的与那里发布的相同。

    【讨论】:

      【解决方案10】:

      您需要确保您的系统为您的应用启用声音通知,某些设备(如 小米)默认禁用此选项,因此您在访问之前不会听到通知声音:

      设置 > 通知 >(搜索您的应用并点击它的名称)...

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

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2017-01-14
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多