web-dev-qa-db-ja.com

PATHを使用してMediaStoreのすべての音楽を一覧表示する

わかりましたので、私は数日間このプロジェクトに取り組んでおり、ほとんどの時間はデバイス上のすべての音楽をリストビューなどで一覧表示する方法を検討してきました。これは私を殺している。ほとんどの人は芸術家やアルバムなどのサブフォルダーを持っているので、MP3や音楽ファイルのサブフォルダーを検索する方法が必要です。

これが私がこれまで音楽コレクションのために持っていたものです:

package com.androidhive.musicplayer;

import Java.io.File;
import Java.io.FilenameFilter;
import Java.util.ArrayList;
import Java.util.HashMap;

import Android.provider.MediaStore;

public class SongsManager {
// SDCard Path
final String MEDIA_PATH = new String(MediaStore.Audio.Media.getContentUri("external").toString());
private ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

// Constructor
public SongsManager(){

}

/**
 * Function to read all mp3 files from sdcard
 * and store the details in ArrayList
 * */
public ArrayList<HashMap<String, String>> getPlayList(){
    File home = new File(MEDIA_PATH);

    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);
        }
    }
    // return songs list array
    return songsList;
}

/**
 * Class to filter files which are having .mp3 extension
 * */
class FileExtensionFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return (name.endsWith(".mp3") || name.endsWith(".MP3"));
    }
}

}

手伝ってくれる人に感謝します。 :)

31
user1853951

投稿は古いものですが、私のような他の人がファイルパスを使用して音楽のリストを作成するというアイデアを得られるように、ここにソリューションを追加しました。 MediaStore.Audio.Media.DATA列には、実際にはメディアファイルのパスが含まれています。次のスニペットを使用して、必要な情報を取得できます。

ContentResolver cr = getActivity().getContentResolver();

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder = MediaStore.Audio.Media.TITLE + " ASC";
Cursor cur = cr.query(uri, null, selection, null, sortOrder);
int count = 0;

if(cur != null)
{
    count = cur.getCount();

    if(count > 0)
    {
        while(cur.moveToNext())
        {
            String data = cur.getString(cur.getColumnIndex(MediaStore.Audio.Media.DATA));
            // Add code to get more column here

            // Save to your list here
        }

    }
}

cur.close();
29
MARK002-MAB

このコード を使用して、すべての音楽ファイルをリストできます。

//Some audio may be explicitly marked as not being music
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";

String[] projection = {
        MediaStore.Audio.Media._ID,
        MediaStore.Audio.Media.ARTIST,
        MediaStore.Audio.Media.TITLE,
        MediaStore.Audio.Media.DATA,
        MediaStore.Audio.Media.DISPLAY_NAME,
        MediaStore.Audio.Media.DURATION
};

cursor = this.managedQuery(
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
        projection,
        selection,
        null,
        null);

private List<String> songs = new ArrayList<String>();
while(cursor.moveToNext()) {
        songs.add(cursor.getString(0) + "||" 
                    + cursor.getString(1) + "||" 
                    + cursor.getString(2) + "||"
                    + cursor.getString(3) + "||"
                    + cursor.getString(4) + "||" 
                    + cursor.getString(5));
}

このコードは試していませんが、正しいようです。あなたはそれで正しい軌道に乗るでしょう。

20

私は今、同じプロジェクトに取り組んでおり、すでに問題を解決しています。

曲のデータを保存するには、カスタムクラスが必要になります。

package YOUR_PACKAGE;

public class Songs
{
    private long mSongID;
    private String mSongTitle;

    public Songs(long id, String title){
        mSongID = id;
        mSongTitle = title;
    }

    public long getSongID(){
        return mSongID;
    }

    public String getSongTitle(){
        return mSongTitle;
    }
}

次に、データを入力するリストビューを使用して、アクティビティでArrayListを定義する必要があります。

private ArrayList<Songs> arrayList;

およびonCreateで:

arrayList = new ArrayList<Songs>();

次に、デバイスからデータを取得する必要があります。

public void YOUR_METHOD_NAME(){
    ContentResolver contentResolver = getContentResolver();
    Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor songCursor = contentResolver.query(songUri, null, null, null, null);

    if(songCursor != null && songCursor.moveToFirst())
    {
        int songId = songCursor.getColumnIndex(MediaStore.Audio.Media._ID);
        int songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);

        do {
            long currentId = songCursor.getLong(songId);
            String currentTitle = songCursor.getString(songTitle);
            arrayList.add(new Songs(currentId, currentTitle, currentArtist));
        } while(songCursor.moveToNext());
    }
}

次に、onCreateからこのメソッドを呼び出します。

YOUR_METHOD_NAME();

最後に、カスタムアダプタークラスを作成し、このアダプターをonCreateで(ListViewでのアクティビティで)定義し、このアダプターをListViewオブジェクトに設定する必要があります。

3年前に質問されたことがわかり、問題はすでに解決していると思いますが、誰かに役立つかもしれません。ありがとう。

3
Levan Voronin

File Objectのすべてのオーディオファイルを提供する簡単な関数を次に示します。

 public static List<File> getAllAudios(Context c) {
    List<File> files = new ArrayList<>();
    String[] projection = { MediaStore.Audio.AudioColumns.DATA ,MediaStore.Audio.Media.DISPLAY_NAME};
    Cursor cursor = c.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);
    try {
        cursor.moveToFirst();
        do{
            files.add((new File(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)))));
        }while(cursor.moveToNext());

        cursor.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return files;
}
0
Bilal Mustafa