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を返し、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 に答える