我正在编写一个 android 应用程序,我想访问由 android 默认音乐应用程序创建的播放列表。
在我的应用程序中,用户应该能够浏览播放列表并选择要播放的任何播放列表。
所以基本上我想知道如何访问它以及当用户选择任何播放列表时,如何将它传递给默认音乐应用程序以在后台播放它。
它与 ContentProvider 或 mediastore 有关吗?我真的不知道如何访问其他应用程序上的数据。
非常感谢!
要播放上述播放列表中的歌曲,我正在调用该函数
PlaySongsFromAPlaylist( PlayListID ); // 0 < 播放列表 ID < 计数
从上面的onCreate方法。其余代码如下所述。
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();
}
}
希望这会奏效。:)
这个活动结合了 Ankur Pandya 的两个答案来列出设备上的播放列表,然后从第一个播放列表中播放第一首曲目。
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();
}
}
}
为了显示用户在 Android 的默认音乐应用程序中创建的所有播放列表,我在我的 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();
}
在使用之前不要忘记包含这些
import android.net.Uri;
import android.provider.MediaStore;
import android.database.Cursor;
此代码经过测试并且在target = android-8上工作正常