You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:06:04