首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 獲取 res/raw 音頻文件名稱與時長:反射遍歷 + MediaPlayer 方案

     編輯:程式設計綜合問答

核心代碼

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 (API 10+)

MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(context, uri);
String durStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
int duration = Integer.parseInt(durStr);
mmr.release();

無需 prepare(),解碼更輕量,適合批量掃描。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved