public List getRawAudioList(Context context) {
List list = new ArrayList<>();
Field[] fields = R.raw.class.getDeclaredFields();
MediaPlayer mp = new MediaPlayer();
for (Field field : fields) {
try {
int resId = field.getInt(R.raw.class);
String name = field.getName();
Uri uri = Uri.parse("android.resource://" + context.getPackageName() + "/" + resId);
mp.reset();
mp.setDataSource(context, uri);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.prepare(); // 同步準備,耗時較短
int duration = mp.getDuration(); // 毫秒
list.add(new AudioInfo(name, duration, uri));
} catch (Exception e) {
e.printStackTrace();
}
}
mp.release();
return list;
}
static class AudioInfo {
String name; int duration; Uri uri;
AudioInfo(String n, int d, Uri u) { name=n; duration=d; uri=u; }
}
R.raw.class.getDeclaredFields() 反射獲取所有 raw 資源 ID 與名稱,無需手工維護列表。MediaPlayer.prepare() 同步解碼頭部獲取時長,raw 資源較小通常 < 100ms;大量文件可改用 MediaMetadataRetriever 異步提取。mp.reset() 復用單個實例,避免頻繁創建/釋放開銷。String.format("%02d:%02d", duration/60000, (duration%60000)/1000)。MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(context, uri);
String durStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
int duration = Integer.parseInt(durStr);
mmr.release();
無需 prepare(),解碼更輕量,適合批量掃描。