List all music in MediaStore with the PATHs

前端 未结 4 1719
刺人心
刺人心 2020-12-02 10:45

Ok so I\'ve been working on this project for a few days now and most of my time has been working out how to list all the music on a device in a LIST VIEW or something else,

相关标签:
4条回答
  • 2020-12-02 11:18

    Here is a simple function who gives you all audio files in 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 讨论(0)
  • 2020-12-02 11:19

    You can list all the music files using this code

    //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));
    }
    

    I have not tried this code, but it seems correct. You'll be on the right track with that.

    0 讨论(0)
  • 2020-12-02 11:23

    I'm working on same project right now and already solved the problem.

    You will need a custom class to store your songs data:

    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;
        }
    }
    

    Then you have to define ArrayList in activity with List View which you will populate with data:

    private ArrayList<Songs> arrayList;
    

    and in onCreate:

    arrayList = new ArrayList<Songs>();
    

    Then you have to retrieve data from your device:

    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());
        }
    }
    

    Then call this method from onCreate:

    YOUR_METHOD_NAME();
    

    And finally you have to create custom adapter class, define this adapter in onCreate (in activity with ListView) and set this adapter on your ListView object.

    I see that it was asked 3 years ago and the problem I think already solved, but maybe it will be usefull for someone. Thanks.

    0 讨论(0)
  • 2020-12-02 11:28

    Although, the post is old, for other people like me to get the idea of creating a list of music with their file path, I added the solution here. MediaStore.Audio.Media.DATA column actually contains media file path. You can get necessary information by using the following snippet:

    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();
    }
    
    0 讨论(0)
提交回复
热议问题