我想初始化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
答案 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
资源上编译迭代也是在开发时间内完成的。这是您在编译之前应该解决的问题,而不是找出运行时中的文件,也就是说,您应该在代码中按名称列出文件。