1

所以我找到了这个 关于如何制作音乐播放器的教程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;
}
4

2 回答 2

1

我可以看到一些错误,但最大的错误是当您递归时,您会丢弃生成的地图。

其他问题:

  • 您对没有列出的后缀之一的每个文件进行递归......但您实际上应该只对目录进行递归。

  • 您的方法每个目录最多调用listFiles(...)3 次。

  • 您的方法可以调用listFiles(...)表示File文件而不是目录的 a 。这将返回 a null,如果您不对其进行测试,您将获得 NPE。(而且因为你也递归文件......)

  • HashMap 可能是代表“歌曲”的糟糕选择。创建一个自定义类。

  • 测试一些布尔表达式== false是蹩脚的。使用!运算符!

于 2013-02-04T14:25:29.843 回答
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);
        }
    }

但是这段代码加载缓慢:(

于 2016-04-26T01:09:37.017 回答