Flutter使用Awesome Notification如何支持用户从存储选择自定义通知音效?
实现方案说明
这个需求完全可以实现,awesome_notifications插件原生支持读取设备本地存储的音频文件作为通知音效,你只需要调整部分代码逻辑、适配平台差异即可,具体操作如下:
前置注意事项
- 安卓8.0及以上版本中,通知通道的配置一旦首次创建就无法修改,如果你原来初始化通道时指定了固定
soundSource,后续要更换自定义音效时,需要先调用AwesomeNotifications().removeChannel('alarm_notification')删除原有通道,再重新创建新的通知通道。 - 提前申请对应平台的权限:安卓需要申请存储读取权限,iOS需要申请通知声音权限、媒体库读取权限。
- 要保证自定义音效的格式符合平台要求:安卓支持MP3、WAV、OGG等常见音频格式,iOS支持WAV、CAF、MP3、AIFF格式,建议用户选择时做格式校验。
具体实现步骤
- 用文件选择类插件让用户选择设备本地的音频文件,获取到音频文件的绝对路径。如果是iOS系统,需要将选中的音频文件拷贝到App沙箱的Library目录下,再获取沙箱内的文件路径,避免权限问题导致无法读取。
- 给
customSound参数传值时,需要在文件路径前拼接file://前缀,调整后的创建通知代码示例如下:
// 假设selectedAudioPath是用户选中的音频文件绝对路径 String customSoundPath = "file://$selectedAudioPath"; AwesomeNotifications().createNotification( content: NotificationContent( id: alarmId, channelKey: 'alarm_notification', title: alarmTitle, body: alarmBody, displayOnBackground: true, displayOnForeground: true, customSound: customSoundPath, ), schedule: NotificationCalendar( hour: alarmTime.hour, minute: alarmTime.minute, second: 0, millisecond: 0, timeZone: "Asia/Jakarta", repeats: true, ) );
customSound指定的音效优先级高于通知通道设置的默认soundSource,不需要每次换音效都重建通道,直接修改createNotification里的customSound值即可。如果需要让自定义音效作为通道的默认音效,初始化通道时将soundSource参数设置为拼接前缀后的路径即可。
内容的提问来源于stack exchange,提问作者adhiskara
相关产品推荐
相关产品推荐

