How can I access playlist created by android default music app and call the music app to play it?
I am writing an android app, and I want to access the playlist created by android default music app.
In my app, the user should be able to browse th开发者_开发知识库e playlist and select any playlist to play.
So basically I want to know how to access it and when user selects any playlist, how to pass it to default music app to play it in background.
Is it something to do with ContentProvider or mediastore?? I really don't know how to access data on other apps.
Thank you so much!
To play the songs from above playlists, I m calling the function
PlaySongsFromAPlaylist( PlayListID ); // 0 < PlayListID < count
from the above onCreate method. And remaining code is as per mentioned below.
public void PlaySongsFromAPlaylist(int playListID){
String[] ARG_STRING = {MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Video.Media.SIZE,android.provider.MediaStore.MediaColumns.DATA};
Uri membersUri = MediaStore.Audio.Playlists.Members.getContentUri("external", playListID);
Cursor songsWithingAPlayList = mThis.managedQuery(membersUri, ARG_STRING, null, null, null);
int theSongIDIwantToPlay = 0; // PLAYING FROM THE FIRST SONG
if(songsWithingAPlayList != null)
{
songsWithingAPlayList.moveToPosition(theSongIDIwantToPlay);
String DataStream = songsWithingAPlayList.getString(4);
PlayMusic(DataStream);
songsWithingAPlayList.close();
}
}
public static void PlayMusic(String DataStream){
MediaPlayer mpObject = new MediaPlayer();
if(DataStream == null)
return;
try {
mpObject.setDataSource(DataStream);
mpObject.prepare();
mpObject.start();
} catch (Exception e) {
e.printStackTrace();
}
}
Hope this will work. :)
This activity combines Ankur Pandya's two answers to list the playlists on the device and then play the first track from the first playlist.
package com.withoutstones.pandyaplaylists;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
/**
* @author Ankur Pandya
* @author Tommy Herbert
*/
public class PandyaPlaylistsActivity extends Activity {
// constants
private static final String LOGGING_TAG = "PandyaPlaylists";
// static methods
/**
* Create a MediaPlayer and play the specified audio file. Note that a full app would usually
* call stop() and release() on the player after use.
*
* @param path
* to data file
*/
public static void playAudio(final String path) {
final MediaPlayer player = new MediaPlayer();
if (path == null) {
Log.e(LOGGING_TAG, "Called playAudio with null data stream.");
return;
}
try {
player.setDataSource(path);
player.prepare();
player.start();
} catch (Exception e) {
Log.e(LOGGING_TAG, "Failed to start MediaPlayer: " + e.getMessage());
return;
}
}
// superclass overrides
@Override
public void onCreate(final Bundle savedInstanceState) {
// Create the superclass portion of the object.
super.onCreate(savedInstanceState);
// Set up the UI.
this.setContentView(R.layout.main);
// Get a cursor over all playlists.
final ContentResolver resolver = this.getContentResolver();
final Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
final String idKey = MediaStore.Audio.Playlists._ID;
final String nameKey = MediaStore.Audio.Playlists.NAME;
final String[] columns = { idKey, nameKey };
final Cursor playLists = resolver.query(uri, columns, null, null, null);
if (playLists == null) {
Log.e(LOGGING_TAG, "Found no playlists.");
return;
}
// Log a list of the playlists.
Log.i(LOGGING_TAG, "Playlists:");
String playListName = null;
for (boolean hasItem = playLists.moveToFirst(); hasItem; hasItem = playLists.moveToNext()) {
playListName = playLists.getString(playLists.getColumnIndex(nameKey));
Log.i(LOGGING_TAG, playListName);
}
// Play the first song from the first playlist.
playLists.moveToFirst();
final long playlistID = playLists.getLong(playLists.getColumnIndex(idKey));
this.playTrackFromPlaylist(playlistID);
// Close the cursor.
if (playLists != null) {
playLists.close();
}
}
// PandyaPlaylistsActivity instance methods
/**
* Play the first track on the specified playlist.
*
* @param playListID
* from the MediaStore database
*/
public void playTrackFromPlaylist(final long playListID) {
final ContentResolver resolver = this.getContentResolver();
final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playListID);
final String dataKey = MediaStore.Audio.Media.DATA;
Cursor tracks = resolver.query(uri, new String[] { dataKey }, null, null, null);
if (tracks != null) {
tracks.moveToFirst();
final int dataIndex = tracks.getColumnIndex(dataKey);
final String dataPath = tracks.getString(dataIndex);
PandyaPlaylistsActivity.playAudio(dataPath);
tracks.close();
}
}
}
To display all the playlist created by user in default music application in Android, I am using following block of code in my Activity:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] proj = {"*"};
Uri tempPlaylistURI = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
// In the next line 'this' points to current Activity.
// If you want to use the same code in other java file then activity,
// then use an instance of any activity in place of 'this'.
Cursor playListCursor= this.managedQuery(tempPlaylistURI, proj, null,null,null);
if(playListCursor == null){
System.out.println("Not having any Playlist on phone --------------");
return;//don't have list on phone
}
System.gc();
String playListName = null;
System.out.println(">>>>>>> CREATING AND DISPLAYING LIST OF ALL CREATED PLAYLIST <<<<<<");
for(int i = 0; i <playListCursor.getCount() ; i++)
{
playListCursor.moveToPosition(i);
playListName = playListCursor.getString(playListCursor.getColumnIndex("name"));
System.out.println("> " + i + " : " + playListName );
}
if(playListCursor != null)
playListCursor.close();
}
Don't forget to include these before using
import android.net.Uri;
import android.provider.MediaStore;
import android.database.Cursor;
This code is Tested and working fine over target = android-8
精彩评论