7

我遇到了将音乐集成到我的 Android 应用程序中的障碍。目标只是让用户通过 Google Play Music(或任何其他播放器,如 Winamp、Poweramp、doubleTwist 等)查看和播放他们已经可以访问的歌曲。

到目前为止,我已经尝试了几种方法,但每种方法都有问题。

方法 #1:使用 ContentResolver 查询从 Google Play 音乐中获取播放列表和歌曲,然后使用 MediaPlayer 播放

首先,在播放列表上找到光标:

String[] proj = { MediaStore.Audio.Playlists.NAME,
                  MediaStore.Audio.Playlists._ID };
Uri playlistUri = Uri.parse("content://com.google.android.music.MusicContent/playlists");
Cursor playlistCursor = getContentResolver().query(playlistUri, proj, null, null, null);

然后迭代获取每个播放列表中的歌曲,并像这样读取它们:

String[] proj2 = { MediaStore.Audio.Playlists.Members.TITLE,
                   MediaStore.Audio.Playlists.Members._ID };
String playListRef = "content://com.google.android.music.MusicContent/playlists/" + playListId + "/members";
Uri songUri = Uri.parse(playListRef);
Cursor songCursor = getContentResolver().query(songUri, proj2, null, null, null);

这可以获取播放列表和歌曲,但是您实际上无法播放它们(即使您告诉 Google Play 音乐“保留在设备上”)。具体来说,以下代码不会播放如上找到的给定歌曲:

mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
    mediaPlayer.setDataSource(dataPath);
    mediaPlayer.prepare();
    mediaPlayer.start();
} catch (Exception e) {}

事实上,我已经扫描了设备,但无法在任何地方找到文件(即使我已经通过完全禁用网络确认它们是本地的——在 Galaxy Nexus 和 Galaxy S3 上)。

方法 2:使用 Intent 调用 Google Play Music 或其他播放器

根据这篇文章,您可以简单地使用 Intents 调用播放器,如下所示:

Intent intent = new Intent();  
intent.setAction(android.content.Intent.ACTION_VIEW);  
File file = new File(YOUR_SONG_URI);  
intent.setDataAndType(Uri.fromFile(file), "audio/*");  
startActivity(intent);

但我认为这种方法不允许进行任何类型的控制——例如,传递要播放的特定歌曲,或者在歌曲播放完毕时收到通知。此外,@CommonWares 指出音乐应用程序及其 Intent 不是 Android SDK 的公共 API 的一部分,可能会在没有警告的情况下更改。

由于与 iTunes 的紧密集成,我试图实现的基本功能存在于 iOS 中。我认为谷歌会希望实现同样的整合,因为这可能意味着在 Play 商店中销售更多的音乐。

总结:是否可以让用户在 Android 上查看和播放他们已经可以访问的歌曲?使用 Google Play 音乐或任何其他应用程序执行此操作的最佳方式是什么?谢谢。

4

1 回答 1

1

方法 #1 有点工作(在设备上使用本地音乐进行测试),感谢 OP 的指导。

笔记:

  • 我们在这里使用了一个未记录的内部 API——它不可靠。
  • 我无法访问 Google Play 音乐中的在线/购买的音乐,因此答案仅指本地存储的音乐。

下面的代码将迭代播放列表中的所有歌曲并播放最后一首。

请注意“SourceId”列 - 这是您根据文档使用的音频 ID 。我通过迭代游标返回的所有列找到了它。那里还有几个更有趣的列,例如“hasLocal”、“hasRemote”,它们可能(或不)指的是音乐的存储位置。

String[] proj2 = { "SourceId", MediaStore.Audio.Playlists.Members.TITLE, MediaStore.Audio.Playlists.Members._ID };
String playListRef = "content://com.google.android.music.MusicContent/playlists/" + playListId + "/members";
Uri songUri = Uri.parse(playListRef);
Cursor songCursor = getContentResolver().query(songUri, proj2, null, null, null);

long audioId = -1;
while (songCursor.moveToNext()) {
    audioId = songCursor.getLong(songCursor.getColumnIndex("SourceId"));
    String title = songCursor.getString(songCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.TITLE));
    Log.v("", "audioId: " + audioId + ", title: " + title);
}
songCursor.close();

MediaPlayer mpObject = new MediaPlayer();
try {
    if (audioId > 0) {
        Uri contentUri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, Long.valueOf(audioId));
        mpObject.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mpObject.setDataSource(this, contentUri);
        mpObject.prepare();
        mpObject.start();

    }
} catch (Exception e) {
    e.printStackTrace();
}
于 2013-07-19T14:14:04.423 回答