如何访问由Android默认音乐应用程序创建的播放列表,并调用音乐应用程序进行播放?

14

我正在编写一个安卓应用程序,希望能够访问安卓默认音乐应用程序创建的播放列表。

在我的应用程序中,用户应该能够浏览播放列表并选择任何一个播放列表进行播放。

基本上,我想知道如何访问它,当用户选择任何播放列表时,如何将其传递给默认的音乐应用程序,在后台播放它。

这与ContentProvider或MediaStore有关吗?我真的不知道如何访问其他应用程序中的数据。

非常感谢!


我正在编写一个Android应用程序,我想访问由Android默认音乐应用程序创建的播放列表。那么,具体是哪个“默认音乐应用程序”呢? - CommonsWare
预装在安卓系统中的应该是music.apk。 - Wesley
@Weley:Android系统上没有一个“默认的音乐应用程序”。每个设备制造商都可以拥有自己的音乐应用程序。我不知道是否存在一个可以获取它们任何一个播放列表数据的API。 - CommonsWare
嗨。你能告诉我如何获取默认播放列表吗?下面发布的答案没有帮助。 - Apurva
3个回答

10

为了播放上面的播放列表中的歌曲,我调用函数

PlaySongsFromAPlaylist( PlayListID ); // 0 < PlayListID < count

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

希望这会有效。:)


如果 "final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playListID)" 无法工作,请使用 final Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - Ankur
1
你能更新一下你的回答吗?这段代码不起作用。我已经在Lollipop和Marshmallow上尝试过了。 - Apurva

8

此操作将结合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();
        }
    }
}

你能更新一下你的回答吗?这段代码不起作用。我已经在Lollipop和Marshmallow上尝试过了。 - Apurva

6
为了在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;

这段代码已经测试过,在 目标设备为android-8 的情况下可以正常运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接