Android Firebase 通知没有自定义声音
No custom sound with Android Firebase Notification
我在 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设备是小米A1和奥利奥8.1,也试过小米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
};
尝试从 Firebase 控制台启用声音
有关更多信息,请查看此答案
可能这应该是个问题,也可以尝试删除声音元素中的“.mp3”并使其像
"sound":"mySound"
从 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'
};
我也遇到了同样的问题。我总是得到默认声音,但我按如下方式修复了它。我正在使用 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 文件(虽然我怀疑它是否与音频格式有任何关系,但你可以试试)
我终于找到了解决办法。对于 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
};
也许这有帮助:
在我的例子中,我尝试了上述方法但它没有用,每当我检查 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 上设置了声音
祝你好运!
我也在android中寻找firebase通知的自定义声音的解决方案,我已经通过Notification Channel解决了这个问题。
我创建了一个带有自定义声音的通知通道,该声音在应用程序后台状态下收到通知后播放。
您可以参考以下通知渠道的链接。
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
或
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"
}
注意 - 如果您创建了一次通知渠道,则无法更改声音。您必须使用新名称和您想要的声音创建一个新的通知频道。
我在尝试此操作时犯的一个错误是我没有更改频道 ID,尽管我更新了 Json 并修改了代码。我的频道总是绑定到设备声音。就在我更新到不同的频道 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());
我在 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设备是小米A1和奥利奥8.1,也试过小米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
};
尝试从 Firebase 控制台启用声音
有关更多信息,请查看此答案
可能这应该是个问题,也可以尝试删除声音元素中的“.mp3”并使其像
"sound":"mySound"
从 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'
};
我也遇到了同样的问题。我总是得到默认声音,但我按如下方式修复了它。我正在使用 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 文件(虽然我怀疑它是否与音频格式有任何关系,但你可以试试)
我终于找到了解决办法。对于 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
};
也许这有帮助: 在我的例子中,我尝试了上述方法但它没有用,每当我检查 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 上设置了声音
祝你好运!
我也在android中寻找firebase通知的自定义声音的解决方案,我已经通过Notification Channel解决了这个问题。
我创建了一个带有自定义声音的通知通道,该声音在应用程序后台状态下收到通知后播放。
您可以参考以下通知渠道的链接。
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
或
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"
}
注意 - 如果您创建了一次通知渠道,则无法更改声音。您必须使用新名称和您想要的声音创建一个新的通知频道。
我在尝试此操作时犯的一个错误是我没有更改频道 ID,尽管我更新了 Json 并修改了代码。我的频道总是绑定到设备声音。就在我更新到不同的频道 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());