-1

I want to get song based on a particular playlist.I get all song's audio id but not getting any other info like title, artist , album etc. I also tried this that is the same problem as mine.
this is how I'm adding song to playlist :

public static void addToPlaylist(ContentResolver resolver, long audioId, int playlistId) {
    String[] cols = new String[] {
            "count(*)"
    };
    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
    Cursor cur = resolver.query(uri, cols, null, null, null);
    cur.moveToFirst();
    final int base = cur.getInt(0);
    cur.close();
    ContentValues values = new ContentValues();
    values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base +(int) audioId));
    values.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audioId);
    Uri u =resolver.insert(uri, values);
    Log.d("ItemFragment", "Added Playlist Item: " + u + " for AUDIO_ID " + audioId+" and PLAYLIST_ID = "+playlistId);

}

and then I retrieve songs from a particular playlist like this :

public ArrayList<AudioFile> getSongListFromPlayList() {
    ArrayList<AudioFile> audioFiles = new ArrayList<>();
    String[] proj = {   MediaStore.Audio.Playlists.Members.AUDIO_ID};
    Cursor musicCursor = musicResolver.query(MediaStore.Audio.Playlists.Members.getContentUri("external",id)
            , proj, null, null, null);
    int x = 0;
    Log.d(TAG,"cursor count : "+musicCursor.getCount());
    if ((musicCursor != null) && (musicCursor.moveToFirst())) {
        do {
            long a_id = musicCursor.getLong(musicCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));
            Uri mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            String[] projection = new String[]{MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM,
                    MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID};
            String selection = MediaStore.Audio.Media._ID + "=?";
            String[] selectionArgs = new String[]{"" + a_id}; //This is the id you are looking for

            Cursor mediaCursor = musicResolver.query(mediaContentUri, projection, selection, selectionArgs, null);
            Log.d(TAG,"second cursor count : "+mediaCursor.getCount());
            if (mediaCursor.getCount() > 0) {
                mediaCursor.moveToPosition(0);
                String title = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                String album = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                String artist = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                String data = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                String duration = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
                long id = mediaCursor.getLong(mediaCursor.getColumnIndex(MediaStore.Audio.Media._ID));

                audioFiles.add(new AudioFile(id,title,artist,data,duration,x));
                x++;
            }
        }while (musicCursor.moveToNext());
    }
    Log.d(TAG,"size : "+audioFiles.size());
    return audioFiles;
}

and while debugging I get log :

D/SecondActivity: cursor count : 11
D/SecondActivity: second cursor count : 1
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: second cursor count : 0
D/SecondActivity: size : 1

please help.

Community
  • 1
  • 1
Brijesh Kumar
  • 1,685
  • 2
  • 17
  • 28

1 Answers1

0

You need to enumerate your cursor and move forward until it reaches the end. Once you have your musicCursor, loop around it using something like this

             if(musicCursor!= null && musicCursor.moveToFirst()){
            for (musicCursor.moveToFirst(); !musicCursor.isAfterLast(); musicCursor.moveToNext()) {
      // do your stuff here, as you cycle through your musicCursor you will read the next audio_id which then gets the relevant data
            }
       }

The for loop will enumerate the cursor. Remove the moveto position, bring the uri outside the loop. If you have several methods in this class, bring it to the top so it is available for all methods yet you define it only once.Defining the projection only needs to happen once so outside the for loop. I have edited your code a little

  public ArrayList<AudioFile> getSongListFromPlayList() {
ArrayList<AudioFile> audioFiles = new ArrayList<>();
String[] proj = {   MediaStore.Audio.Playlists.Members.AUDIO_ID};
Cursor musicCursor = musicResolver.query(MediaStore.Audio.Playlists.Members.getContentUri("external",id)
        , proj, null, null, null);

        String[] projection = new String[]{MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM,
                MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID};
        String selection = MediaStore.Audio.Media._ID + "=?";
if ((musicCursor != null) && (musicCursor.moveToFirst())) {
        for (musicCursor.moveToFirst(); !musicCursor.isAfterLast(); musicCursor.moveToNext()) {
        long a_id = musicCursor.getLong(musicCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));

        String[] selectionArgs = new String[]{"" + a_id}; //This is the id you are looking for
        Cursor mediaCursor = musicResolver.query(mediaContentUri, projection, selection, selectionArgs, null);
            String title = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String album = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
            String artist = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            String data = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            String duration = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
            long id = mediaCursor.getLong(mediaCursor.getColumnIndex(MediaStore.Audio.Media._ID));
            audioFiles.add(new AudioFile(id,title,artist,data,duration,x));

    }
        }


Log.d(TAG,"size : "+audioFiles.size());
return audioFiles;
Theo
  • 2,012
  • 1
  • 16
  • 29
  • so what happens then? Simply stating that it does not work is not really helpful. – Theo Oct 03 '16 at 15:37
  • Actually it was my fault. I was passing wrong "id" here in the "addToPlaylist" method. It was not any of the playlist I created previously. So I changed and code working fine. thanks for your help. – Brijesh Kumar Oct 08 '16 at 05:48