Android Firebase通知没有自定义声音

时间:2018-10-22 12:15:20

标签: android firebase firebase-cloud-messaging android-8.1-oreo

我在Android应用中使用Firebase推送通知。我可以使用自定义图标正确发送通知,但是我无法播放自定义声音。我总是得到设备的默认声音。

{
    "registration_ids": "myToken",
    "notification": {
        "body": "my body",
        "title": "my title",
        "icon": "ic_notification",
        "sound": "mysound.mp3" // I tried "mysound", "mysound.wav"...

    },
    "priority": "high"

}

自定义声音位于/ res / raw

我已经可以使用onMessageReceived和Firebase数据消息播放自定义声音,但是不能使用Firebase通知消息播放。

我的android设备是Xiaomi Mi A1和Oreo 8.1。,也尝试过使用Xiaomi Mi A2获得相同的结果。

我尝试使用php和curl以及node.js ...总是一样的问题,我得到了默认声音。

更新

使用此node.js代码也不起作用:

var registrationToken = 'xxxxxx';

var message = {

    notification: {
      title: 'my title',
      body: 'my body',
    },
    android: {
      ttl: 3600 * 1000,
      notification: {
        color: '#ff0000',
        sound: 'mysound.mp3'
      }
    }, 
    token: registrationToken

};

7 个答案:

答案 0 :(得分:2)

我也在寻找android中Firebase通知的自定义声音解决方案,并且我已经通过通知频道解决了这个问题。

我创建了一个带有自定义声音的通知通道,该声音在应用程序背景状态下收到通知后就会播放。

您可以参考通知渠道的以下链接。

https://medium.com/exploring-android/exploring-android-o-notification-channels-94cd274f604c

https://developer.android.com/training/notify-user/channels

您需要将mp3文件放在 / res / raw / 路径下。

请找到代码。

NotificationManager notificationManager = (NotificationManager) getActivity().getSystemService(NotificationManager.class); // If you are writting code in fragment

OR

NotificationManager notificationManager = (NotificationManager) getSystemService(NotificationManager.class); // If you are writting code in Activity

createNotificationChannel函数

private void createNotificationChannel() { 
 Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.sample); //Here is FILE_NAME is the name of file that you want to play 
// Create the NotificationChannel, but only on API 26+ because 
// the NotificationChannel class is new and not in the support library if 
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
 { 
    CharSequence name = "mychannel"; 
    String description = "testing"; 
    int importance = NotificationManager.IMPORTANCE_DEFAULT; 
    AudioAttributes audioAttributes = new AudioAttributes.Builder() 
     .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
     .setUsage(AudioAttributes.USAGE_ALARM) 
     .build(); 
   NotificationChannel channel = new NotificationChannel("cnid", name, importance); 
   channel.setDescription(description); 
   channel.enableLights(true); channel.enableVibration(true); 
   channel.setSound(sound, audioAttributes); 
   notificationManager.createNotificationChannel(channel); 
  } 
};

createNotificationChannel(); 

要实现此目的,您需要在firebase通知请求对象中传递 android_channel_id 属性。

{
 "notification": {
 "body": "this is testing notification",
 "title": "My App",
 "android_channel_id": "cnid"
 },
 "to": "token"
}

注意-如果您一次创建了一个通知通道,则无法更改声音。您必须使用您想要的声音用新名称创建一个新的通知频道。

答案 1 :(得分:1)

documentation中,将声音包含在android对象下的通知对象中。以声音值给出声音文件的名称。声音文件必须位于 / res / raw / 中。下面是一个Node.js示例:-

  var message = {
  notification: {
    title: 'sample title',
    body: 'Hello, its Tuesday.',
  },
  android: {
    ttl: 3600 * 1000,
    notification: {
      icon: 'my_icon',
      color: '#f45342',
      sound: 'filename.mp3',
    },
  },
  apns: {
    payload: {
      aps: {
        badge: 42,
      },
    },
  },
  topic: 'industry-tech'
};

答案 2 :(得分:0)

尝试从Firebase控制台启用声音

有关更多信息,请看此答案

https://stackoverflow.com/a/44304089/9024123

这可能是个问题,还可以尝试删除声音元素中的“ .mp3”,使其像

"sound":"mySound"

答案 3 :(得分:0)

我也面临着同样的问题。我总是得到默认声音,但是我将其修复如下。我正在使用FCM-push(节点模块)https://www.npmjs.com/package/fcm-push

var message = {  
to : device_token,
collapse_key : '<insert-collapse-key>',
// data : {
//     '<random-data-key1>' : '<random-data-value1>',
//     '<random-data-key2>' : '<random-data-value2>'
// },
notification : {
    title : 'Title ',
    body : 'some Body',
    sound : 'notification' // my .ogg file in /res/raw
},
android: {
sound: 'notification' // my .ogg file name in /res/raw
}
};

我没有尝试过mp3或wav,在您的问题中,您似乎还没有尝试过.ogg文件(尽管我怀疑它是否与音频格式有关,但是您可以尝试)

答案 4 :(得分:0)

最后我找到了解决方案。对于Android 8.0及更高版本,必须在您的应用中创建一个通知频道:

NotificationChannel channel = new NotificationChannel('my_id', name, importance);

(更多信息:https://developer.android.com/training/notify-user/channels#java

然后,当您发送通知时:

var registrationToken = 'xxxxxx';

var message = {

    notification: {
      title: 'my title',
      body: 'my body',
    },
    android: {
      ttl: 3600 * 1000,
      notification: {
        color: '#ff0000',
        sound: 'mysound.mp3',
        channel_id: 'my_id' // important to get custom sound
      }
    }, 
    token: registrationToken

};

答案 5 :(得分:0)

也许这会有所帮助: 就我而言,我尝试了上述方法,但每当我检查onMessageReceived(出于调试目的)通道ID

时,它都无法工作
Log.e(TAG, "Message Notification channel id: " + remoteMessage.getNotification().getChannelId()); 

我总是'null'。

因此,请从此处https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

阅读文档

我发现我为json中的频道ID使用了错误的密钥。

尝试使用“ android_channel_id”键代替“ channel_id”键

"notification": {
        "body": "Body of Your Notification",
        "title": "Title of Your Notification",
        "android_channel_id": "channelId",
        "icon": "myIcon"
    }

如果我像预期的那样使用它,则会播放自定义声音(来自res / raw)

PS:就我而言,我在创建它时将其声音设置在channelId上

祝你好运!

答案 6 :(得分:0)

我在尝试时犯的一个错误是,虽然我更新了 Json 并修改了代码,但我没有更改频道 ID。我的频道总是绑定到设备声音。就在我更新到不同的频道 ID 后,我的代码开始工作。现在可以为前景和背景播放自定义声音

以下是对我有用的 JSON

{
"to" : "token"
,
"notification": {
    "title":"Server Notification Title",
    "body":"Notification Body",
    "sound":"sound.wav",
    "android_channel_id": "ch1"
},
"priority": "high"
}

代码

Uri soundUri = Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.sound);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "ch1")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(getString(R.string.app_name))
            .setContentText(remoteMessage.getNotification().getBody().toString())
            .setAutoCancel(true)
            .setSound(soundUri);

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        if(soundUri != null){
            // Changing Default mode of notification
            notificationBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
            // Creating an Audio Attribute
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_ALARM)
                    .build();

            // Creating Channel
            NotificationChannel channel = new NotificationChannel("ch1","App Name",NotificationManager.IMPORTANCE_HIGH);
            channel.setSound(soundUri,audioAttributes);
            channel.enableLights(true); channel.enableVibration(true);
            mNotificationManager.createNotificationChannel(channel);
        }
    }
    mNotificationManager.notify(0, notificationBuilder.build());