在Flutter中如何遍历Android res文件夹,获取res/raw目录下的音频文件名?
Flutter获取Android res/raw音频文件名方案
1. Android端配置方法通道
在android/app/src/main/kotlin/你的应用包名路径/MainActivity.kt中添加如下代码,注册方法通道用于读取raw目录资源:
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { // 方法通道标识,需和Flutter端保持一致 private val CHANNEL = "notification_utils/res_raw_audio" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "getAllAudioFiles") { val audioFileNames = mutableListOf<String>() // 遍历raw类的所有字段获取资源名 val rawFields = R.raw::class.java.fields for (field in rawFields) { val resName = field.name val resId = resources.getIdentifier(resName, "raw", packageName) if (resources.getResourceTypeName(resId) == "raw") { audioFileNames.add(resName) } } result.success(audioFileNames) } else { result.notImplemented() } } } }
2. Flutter端调用通道获取文件名
import 'package:flutter/services.dart'; // 与Android端一致的通道标识 const MethodChannel _channel = MethodChannel('notification_utils/res_raw_audio'); Future<List<String>> getAndroidRawAudioFiles() async { try { final List<dynamic> res = await _channel.invokeMethod('getAllAudioFiles'); return res.cast<String>(); } on PlatformException catch (_) { return []; } }
3. 配合flutter_local_notifications设置自定义提示音
获取到的文件名可以直接传入RawResourceAndroidNotificationSound中使用,不需要加文件后缀:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; final FlutterLocalNotificationsPlugin notificationsPlugin = FlutterLocalNotificationsPlugin(); // 示例:发送带自定义提示音的通知 Future<void> sendNotification(String rawSoundFileName) async { final androidDetails = AndroidNotificationDetails( 'custom_sound_channel', '自定义提示音通知', importance: Importance.max, priority: Priority.high, // 直接传入从raw目录获取的文件名即可 sound: RawResourceAndroidNotificationSound(rawSoundFileName), ); await notificationsPlugin.show( DateTime.now().microsecond, '通知标题', '通知内容', NotificationDetails(android: androidDetails), ); }
注意事项
- 所有音频文件需要提前放入
android/app/src/main/res/raw目录,raw目录不存在需要手动创建 - 同名资源无论后缀是否不同,Android都会识别为冲突,需保证所有音频文件命名唯一
- 安卓通知通道创建后无法修改提示音配置,修改提示音后需要更换通道ID或者卸载应用重装才能生效
内容的提问来源于stack exchange,提问作者PoeMcMoe
相关产品推荐
相关产品推荐

