如何在本地通知上播放不同的声音文件
How to play different sound files on local notifications
当我的 Xamarin phone 应用收到新事件时,会弹出本地通知。这工作正常,它也播放声音。但是,我想根据我的应用收到的事件类型播放不同的声音。我认为这已经足够简单了,但是无论代码如何,在我重建应用程序后首先播放的声音都是随后为每个通知播放的声音。
例如,重建后,如果优先级枚举为 Priority.Temp,则将播放 TempNotif.wav。但是如果代码再次调用此方法以显示另一个通知并且优先级枚举不是 Priority.Temp,TempNotif.wav 仍然会播放,即使我已将其设置为播放 StandardNotif.wav。似乎 android 复制了第一个声音,一旦有声音就不会更新它。无论发生什么,我当然可以为不同的通知播放不同的声音吗?
代码如下:
public void CreateNotification(string title, string message, Priority priority)
{
Android.Net.Uri sound = null;
if (priority == Priority.Temperature)
{
sound = global::Android.Net.Uri.Parse($!{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.TempNotif}");
}
else
{
sound = global::Android.Net.Uri.Parse($!{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.StandardNotif}");
}
var alarmAttributes = new AudioAttributes.Builder()
.SetContentType(AudioContentType.Sonification)
.SetUsage(AudioUsageKind.Notification).Build();
builder = new NotificationCompat.Builder(context, notificationChannelId);
builder.SetContentTitle(title)
.SetAutoCancel(true)
.SetContentText(message)
.SetPriority((int)NotificationPriority.High)
.SetSmallIcon(Resource.Drawable.MetroIcon)
.SetColor(00255)
.SetVibrate(new long[0])
.SetSound(sound)
.SetVisibility((int)NotificationVisibility.Public);
notificationManager = context.GetSystemService(Context.NotificationService) as
NotificationManager;
if (global::Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
NotificationImportance importance = NotificationImportance.High;
NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId,
title, importance);
notificationChannel.Importance = NotificationImportance.High;
notificationChannel.EnableLights(true);
notificationChannel.EnableVibration(true);
notificationChannel.SetSound(sound, alarmAttributes);
notificationChannel.SetShowBadge(true);
notificationChannel.SetVibrationPattern(new long[] { 100, 200, 300, 400, 500, 400, 300, 200, 400 });
if (notificationManager != null)
{
builder.SetChannelId(notificationChannelId);
notificationManager.CreateNotificationChannel(notificationChannel);
}
}
notificationManager.Notify(0, builder.Build());
}
感谢@Mooniean 的回答!
答案是为我要显示的每种类型的通知提供不同的渠道 ID。
我为频道 ID 设置了两个静态值,并根据我要显示的通知类型提供了一个。
private static string StandardchannelId = "1000";
private static string TempChannelId = "2000";
在这里,我根据我所做的枚举分配我的频道 ID:
if (priority == Priority.Temperature)
{
this.channelId = TempChannelId;
sound = global::Android.Net.Uri.Parse($"{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.TempNotif}");
}
else
{
this.channelId = StandardchannelId;
sound = global::Android.Net.Uri.Parse($"{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.StandardNotif}");
}
这里我分配了频道ID:
builder.SetChannelId(this.channelId);
当我的 Xamarin phone 应用收到新事件时,会弹出本地通知。这工作正常,它也播放声音。但是,我想根据我的应用收到的事件类型播放不同的声音。我认为这已经足够简单了,但是无论代码如何,在我重建应用程序后首先播放的声音都是随后为每个通知播放的声音。
例如,重建后,如果优先级枚举为 Priority.Temp,则将播放 TempNotif.wav。但是如果代码再次调用此方法以显示另一个通知并且优先级枚举不是 Priority.Temp,TempNotif.wav 仍然会播放,即使我已将其设置为播放 StandardNotif.wav。似乎 android 复制了第一个声音,一旦有声音就不会更新它。无论发生什么,我当然可以为不同的通知播放不同的声音吗?
代码如下:
public void CreateNotification(string title, string message, Priority priority)
{
Android.Net.Uri sound = null;
if (priority == Priority.Temperature)
{
sound = global::Android.Net.Uri.Parse($!{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.TempNotif}");
}
else
{
sound = global::Android.Net.Uri.Parse($!{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.StandardNotif}");
}
var alarmAttributes = new AudioAttributes.Builder()
.SetContentType(AudioContentType.Sonification)
.SetUsage(AudioUsageKind.Notification).Build();
builder = new NotificationCompat.Builder(context, notificationChannelId);
builder.SetContentTitle(title)
.SetAutoCancel(true)
.SetContentText(message)
.SetPriority((int)NotificationPriority.High)
.SetSmallIcon(Resource.Drawable.MetroIcon)
.SetColor(00255)
.SetVibrate(new long[0])
.SetSound(sound)
.SetVisibility((int)NotificationVisibility.Public);
notificationManager = context.GetSystemService(Context.NotificationService) as
NotificationManager;
if (global::Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
NotificationImportance importance = NotificationImportance.High;
NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId,
title, importance);
notificationChannel.Importance = NotificationImportance.High;
notificationChannel.EnableLights(true);
notificationChannel.EnableVibration(true);
notificationChannel.SetSound(sound, alarmAttributes);
notificationChannel.SetShowBadge(true);
notificationChannel.SetVibrationPattern(new long[] { 100, 200, 300, 400, 500, 400, 300, 200, 400 });
if (notificationManager != null)
{
builder.SetChannelId(notificationChannelId);
notificationManager.CreateNotificationChannel(notificationChannel);
}
}
notificationManager.Notify(0, builder.Build());
}
感谢@Mooniean 的回答!
答案是为我要显示的每种类型的通知提供不同的渠道 ID。
我为频道 ID 设置了两个静态值,并根据我要显示的通知类型提供了一个。
private static string StandardchannelId = "1000";
private static string TempChannelId = "2000";
在这里,我根据我所做的枚举分配我的频道 ID:
if (priority == Priority.Temperature)
{
this.channelId = TempChannelId;
sound = global::Android.Net.Uri.Parse($"{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.TempNotif}");
}
else
{
this.channelId = StandardchannelId;
sound = global::Android.Net.Uri.Parse($"{ContentResolver.SchemeAndroidResource}://{context.PackageName}/{Resource.Raw.StandardNotif}");
}
这里我分配了频道ID:
builder.SetChannelId(this.channelId);