如何扫描所有mp3文件,而不仅仅是从我制作的Android媒体播放器的特定路径

时间:2013-02-04 14:06:01

标签: java android eclipse recursion android-mediaplayer

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

2 个答案:

答案 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);
        }
    }

但这段代码加载缓慢:(