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 または他のプレーヤーを呼び出す

この投稿によると、次のようにインテントを使用してプレーヤーを簡単に呼び出すことができます。

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 は、音楽アプリとそのインテントは Android SDK のパブリック API の一部ではなく、警告なしに変更される可能性があると指摘しています。

私が達成しようとしている基本的な機能は、iTunes との緊密な統合のおかげで、iOS に存在します。Playストアでより多くの音楽を販売することを意味する可能性があるため、Googleは同じ種類の統合を実現したいと考えていると思います.

要約: 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 に答える