【问题标题】:How can I access playlist created by android default music app and call the music app to play it?如何访问android默认音乐应用创建的播放列表并调用音乐应用播放?
【发布时间】:2011-11-14 06:40:26
【问题描述】:

我正在编写一个安卓应用,我想访问安卓默认音乐应用创建的播放列表。

在我的应用中,用户应该能够浏览播放列表并选择要播放的任何播放列表。

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

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

非常感谢!

【问题讨论】:

  • "我正在编写一个安卓应用,我想访问安卓默认音乐应用创建的播放列表。" -- 究竟是哪一种“默认音乐应用”?
  • android上预装的那个,我想是music.apk
  • @Weley:没有单一的“默认音乐应用程序”“预装在 android 上”。欢迎每个设备制造商拥有自己的音乐应用程序。我不知道有一个 API 可以获取其中任何一个的播放列表数据。
  • 我明白了...感谢您的帮助
  • 嗨。你能告诉我如何获取默认的播放列表吗?下面发布的答案无济于事

标签: android media playlist


【解决方案1】:

要播放上述播放列表中的歌曲,我正在调用该函数

PlaySongsFromAPlaylist( PlayListID ); // 0

来自上面的 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;
  • 你能更新你的答案吗?此代码不起作用。我在棒棒糖和棉花糖上试过这个
【解决方案2】:

此活动结合 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();
        }
    }
}

【讨论】:

  • 你能更新你的答案吗?此代码不起作用。我在棒棒糖和棉花糖上试过这个
【解决方案3】:

为了显示用户在 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

上运行良好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多