You need to enable JavaScript to run this app. 在Flutter中如何遍历Android res文件夹,获取res/raw目录下的音频文件名?
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 20:06:02