如何在Flutter中获取手机系统铃声并设置为应用默认铃声
Flutter获取系统铃声并设置应用默认铃声的实现方案
前置权限说明
- 安卓端需要先申请
READ_EXTERNAL_STORAGE(安卓13及以上换成READ_MEDIA_AUDIO)权限,仅修改应用内默认铃声不需要额外权限,若要同步修改系统全局铃声需额外申请WRITE_SETTINGS特殊权限。 - iOS端受系统沙盒限制,只能获取系统预置的标准铃声列表,无法访问用户自定义导入的第三方铃声,也不支持第三方应用修改系统全局铃声配置。
实现步骤
1. 集成依赖
在pubspec.yaml中添加需要的依赖包:
dependencies: flutter: sdk: flutter ringtone_manager: ^最新稳定版本 # 用于获取系统铃声列表 shared_preferences: ^最新稳定版本 # 存储应用默认铃声配置 permission_handler: ^最新稳定版本 # 权限申请 audioplayers: ^最新稳定版本 # 应用内播放铃声
2. 权限申请代码示例
import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; Future<bool> checkAndRequestPermission() async { if (Platform.isAndroid) { final androidInfo = await DeviceInfoPlugin().androidInfo; // 安卓13及以上用媒体音频权限 if (androidInfo.version.sdkInt >= 33) { var status = await Permission.readMediaAudio.request(); return status.isGranted; } else { var status = await Permission.storage.request(); return status.isGranted; } } // iOS获取系统预置铃声无需额外权限 return true; }
3. 获取系统铃声列表
import 'package:ringtone_manager/ringtone_manager.dart'; // 可根据需要获取不同类型的铃声 // 来电铃声:RingtoneManager.TYPE_RINGTONE // 通知铃声:RingtoneManager.TYPE_NOTIFICATION // 闹钟铃声:RingtoneManager.TYPE_ALARM List<dynamic> ringtoneList = await RingtoneManager.getRingtones(RingtoneManager.TYPE_NOTIFICATION); // 每个铃声项包含两个核心字段 // title:铃声显示名称 // uri:铃声的本地访问路径/系统标识符
4. 存储用户选中的铃声为应用默认配置
仅设置应用内部默认铃声不需要修改系统配置,直接本地存储选中的铃声uri即可:
import 'package:shared_preferences/shared_preferences.dart'; // 保存用户选择的默认铃声 Future<void> saveAppDefaultRingtone(String ringtoneUri, String ringtoneName) async { final sp = await SharedPreferences.getInstance(); await sp.setString('app_default_ringtone_uri', ringtoneUri); await sp.setString('app_default_ringtone_name', ringtoneName); } // 读取已配置的默认铃声 Future<Map<String, String>?> getAppDefaultRingtone() async { final sp = await SharedPreferences.getInstance(); final uri = sp.getString('app_default_ringtone_uri'); final name = sp.getString('app_default_ringtone_name'); if (uri == null || name == null) return null; return {'uri': uri, 'name': name}; }
5. 应用内播放默认铃声
import 'package:audioplayers/audioplayers.dart'; final AudioPlayer audioPlayer = AudioPlayer(); Future<void> playAppNoticeSound() async { final defaultRingtone = await getAppDefaultRingtone(); if (defaultRingtone == null) { // 未配置自定义铃声时播放应用内置默认铃声 await audioPlayer.play(AssetSource('assets/builtin_default_notice.mp3')); return; } await audioPlayer.play(DeviceFileSource(defaultRingtone['uri']!)); }
注意事项
- 部分安卓定制系统会限制第三方应用读取系统铃声列表,需针对性适配对应厂商的权限申请逻辑
- 若需要把选中铃声设置为系统全局铃声,仅安卓支持该操作,需要额外引导用户开启
修改系统设置的特殊权限 - iOS端仅能使用系统预置铃声,所有修改系统配置的操作都不被苹果官方允许
内容的提问来源于stack exchange,提问作者zaynOm
相关产品推荐
相关产品推荐

