如何动态获取/ res / raw中的所有媒体文件?

时间:2017-07-31 10:44:46

标签: android

我想初始化MediaPlayer中找到的所有声音文件的res/raw个实例:

/res/raw/test1.mp3
/res/raw/test2.mp3
/res/raw/testN.mp3

目的是在点击按钮时播放不同的样本,没有延迟。

List<MediaPlayer> player = new ArrayList<>();

//TODO how to loop properly?
for (Rawfile file : rawfiles) {
    pl = MediaPlayer.create(getBaseContext(), R.raw.test1);
    player.add(pl);
}

稍后,如果点击了button2:

player.get(1).start();

问题:如何在应用初始化期间动态获取R.raw.*文件?

更新:以下内容非常接近,但有两个问题:

1)例如,如果我的/res/raw文件夹中只放置了一个文件“test.mp3”,则该功能显示3个文件。 2)如何将这些文件加载​​到媒体播放器?

public void listRaw(){
    Field[] fields=R.raw.class.getFields();
    for(int count=0; count < fields.length; count++){
        Log.i("Raw Asset: ", fields[count].getName());
    }
}

结果:

I/Raw Asset:: $change
I/Raw Asset:: serialVersionUID
I/Raw Asset:: test

3 个答案:

答案 0 :(得分:1)

目前解决的问题如下,但感觉有点hacky:

public static List<Integer> listRawMediaFiles() {
    List<Integer> ids = new ArrayList<>();
    for (Field field : R.raw.class.getFields()) {
        try {
            ids.add(field.getInt(field));
        } catch (Exception e) {
            //compiled app contains files like '$change' or 'serialVersionUID'
            //which are no real media files
        }
    }
    return ids;
}

答案 1 :(得分:0)

我真的忘记了从哪里得到这个,它可以复制,不是我的代码,但完美的工作:

 private boolean listFiles(String path) {
        String [] list;
        try {
            list = getAssets().list(path);
            if (list.length > 0) {
                // folder founded 
                for (String file : list) {
                    if (!listAssetFiles(path + "/" + file))
                        return false;
                }
            } else {
                //file founded
            }
        } catch (IOException e) {
            return false;
        }
        return true; 
    } 

答案 2 :(得分:0)

虽然受到了投票,但来自CommonsWare的这个answer是全面的。您可以做的最好的事情是通过反射迭代原始字段。如果你找到非资源字段,你应该手动丢弃它们(我看到你在回答中做了)。

有一点:将文件放在raw目录中是在开发时期间完成的,而在raw资源上编译迭代也是在开发时间内完成的。这是您在编译之前应该解决的问题,而不是找出运行时中的文件,也就是说,您应该在代码中按名称列出文件。