所以我找到了关于如何制作音乐播放器的教程http://www.androidhive.info/2012/03/android-building-audio-player-tutorial/。
问题是它只获取/ sdcard / Music /中的mp3文件,而且我还想获得Music文件夹内的文件夹内的mp3文件。
所以我改变了将歌曲列表返回到递归函数的函数,但它不起作用。你能在代码中发现我的错误吗?
filesList来自File []类型,songList是ArrayList>。 当第一次调用此函数时,它获取path =“/ sdcards / Music /”
public ArrayList<HashMap<String, String>> getPlayList(String path)
{
File home = new File(path);
filesList=home.listFiles();
if (home.listFiles(new FileExtensionFilter()).length > 0)
{
for (File file : home.listFiles(new FileExtensionFilter()))
{
HashMap<String, String> song = new HashMap<String, String>();
song.put("songTitle", file.getName().substring(0, (file.getName().length() - 4)));
song.put("songPath", file.getPath());
// Adding each song to SongList
songsList.add(song);
}
}
for(int i=0;i<filesList.length;i++)
{
if((filesList[i].isDirectory()))
getPlayList(filesList[i].getAbsolutePath());
}
return songsList;
}
答案 0 :(得分:1)
我可以看到一些错误,但最重要的是,当你递归时,你扔掉了生成的地图。
其他问题:
您可以递归每个没有列出其中一个后缀的文件......但是您应该只对目录进行递归。
您的方法每个目录最多调用listFiles(...)
三次。
您的方法可以在代表文件而不是目录的listFiles(...)
上调用File
。这将返回null
,如果您不进行测试,您将获得NPE。 (并且因为你也在文件上递归......)
HashMap可能是表示“歌曲”的糟糕选择。创建自定义类。
测试一些布尔表达式== false
是蹩脚的。使用!
运算符!
答案 1 :(得分:1)
此代码适合我,尝试添加
String media_path = Environment.getExternalStorageDirectory().getPath();
String[] splitPath= media_path .split("/");
final String MEDIA_PATH = "/" + splitPath[1] + "/";
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
private String mp3Pattern = ".mp3";
并将您的java代码替换为此
// Constructor
public SongsManager() {
}
/**
* Function to read all mp3 files and store the details in
* ArrayList
* */
public ArrayList<HashMap<String, String>> getPlayList() {
System.out.println(MEDIA_PATH);
if (MEDIA_PATH != null) {
File home = new File(MEDIA_PATH);
File[] listFiles = home.listFiles();
if (listFiles != null && listFiles.length > 0) {
for (File file : listFiles) {
System.out.println(file.getAbsolutePath());
if (file.isDirectory()) {
scanDirectory(file);
} else {
addSongToList(file);
}
}
}
}
// return songs list array
return songsList;
}
private void scanDirectory(File directory) {
if (directory != null) {
File[] listFiles = directory.listFiles();
if (listFiles != null && listFiles.length > 0) {
for (File file : listFiles) {
if (file.isDirectory()) {
scanDirectory(file);
} else {
addSongToList(file);
}
}
}
}
}
private void addSongToList(File song) {
if (song.getName().endsWith(mp3Pattern)) {
HashMap<String, String> songMap = new HashMap<String, String>();
songMap.put("songTitle",
song.getName().substring(0, (song.getName().length() - 4)));
songMap.put("songPath", song.getPath());
// Adding each song to SongList
songsList.add(songMap);
}
}
但这段代码加载缓慢:(