如何在本地通知上播放不同的声音文件

Posted

技术标签:

【中文标题】如何在本地通知上播放不同的声音文件【英文标题】:How to play different sound files on local notifications 【发布时间】:2020-04-08 16:24:13 【问题描述】:

当我的 Xamarin 手机应用收到新事件时,会弹出本地通知。这工作正常,它也播放声音。但是,我想根据我的应用收到的事件类型播放不同的声音。我认为这很简单,但是在我重新构建应用程序后首先播放的任何声音都是随后为每个通知播放的声音,无论代码如何。

例如,在重建之后,如果 Priority 枚举是 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());
    

【问题讨论】:

您需要覆盖您的通知吗?如果在调用 notificationManager.Notify(0, builder.Build()); 时不尝试传递唯一 id 而不是始终传递 0; 我回到电脑前会检查这个,谢谢兄弟 @DavidAndrewThorpe Notification.Builder setSound 方法在 API 级别 26 中已弃用。改用 NotificationChannel#setSound(Uri, AudioAttributes)。请看:developer.android.com/reference/android/app/… @CherryBu-MSFT 我正在使用 NotificationCompat.Builder,我认为它没有贬值? @CherryBu-MSFT 如果您查看我的代码的下半部分,您会发现我已经在使用 NotificationChannel.SetSound() 【参考方案1】:

感谢@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);

【讨论】:

很高兴听到您现在已经解决了您的问题,请记得将您的回复标记为答案,这可能对其他社区成员有所帮助,谢谢。

以上是关于如何在本地通知上播放不同的声音文件的主要内容,如果未能解决你的问题,请参考以下文章

iOS 本地通知不会在锁定屏幕上播放声音

iPhone:如何独立于音量设置大声播放本地通知声音?

在 iPod 库的本地通知中播放声音

本地通知警报声音不在 iPad 上播放,但在 iPhone 上播放相同

如何将音频播放器的音量控制与本地通知的声音联系起来?

在本地通知上发送带有自定义声音的触觉