6

私はAndroidアプリに音楽を統合するロードブロッキングを実行しています。目標は、Google Playミュージック(またはWinamp、Poweramp、doubleTwistなどの他のプレイヤー)を介して、すでにアクセスしている曲を再生することをユーザに許可することです。既にアクセスしているAndroidの曲(Google Playなど)をユーザーに表示して再生させるにはどうすればよいですか?

これまでのところ、いくつかのアプローチを試みましたが、それぞれに問題があります。

アプローチ#1:

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); 

その後:Googleからのプレイリスト&曲は、音楽を再生し、その後まずMediaPlayerの

を使用して再生し、プレイリストにカーソルをゲットするContentResolverのクエリを使用します各プレイリストの曲を取得して、次のように読んでください。

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); 

このワームksを押してプレイリストと曲を取得しますが、実際には再生できません(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:このように、Googleはインテントを使ってテント

this postによると、あなたは、単に呼び出すことができるプレーヤーを使用して、音楽、または他のプレイヤーを再生する起動します。

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に存在します。私はGoogleがPlayストアでもっと多くの音楽を販売することを意味するので、同じ種類の統合を達成したいと思うだろう。

要約: &は既にAndroidにアクセスしている曲を再生することができますか? Google Playミュージックや他のアプリでこれを行うにはどうすればよいでしょうか?ありがとう。

+1

UPDATE:私は、Googleが音楽や他の音楽プレーヤーを再生すると統合するための良い答えを見つけるまで、私は見つけることがContentResolverのクエリを使用して、デバイス上でローカルに保存された音楽ファイルを読み込み、果たしているインタフェースを(開発してきました曲、MediaPlayerで再生できます)。これはうまくいくようですが、mp3やその他の音楽ファイルをデバイスに移動することはユーザーに任せます。私はまだ普及している音楽プレーヤーとの良好な統合を提供することによって誰もが簡単にできる解決策を見つけることを好むだろう....誰でも? – gcl1

+0

あなたのアプローチ#1は、選択したトラックに対応するストリーミングURLを取得してMediaPlayerに渡すと機能するはずです。 –

+0

私が12月に最後にやり直したとき、アプローチ#1をすることができませんでした。しかし、私はあなたが実際にそれをしたかどうかを知ることに非常に興味があります。その間、私がUPDATEのコメントで述べたように、私はユーザーがデバイスにローカルに保存されている音楽を再生できるようにしています。ありがとう。 – gcl1

答えて

1

アプローチ1はちょっとした作品です(デバイス上のローカル音楽でテストされています)。

注:

  • ここでは文書化されていない内部APIでプレーしている - それは信頼性の高い ではありません。
  • 私はGoogleで音楽を購入/購入することができません Play Music。その答えはローカルに保存されている音楽のみを指します。

以下のコードは、プレイリストのすべての曲を繰り返し再生し、最後の曲を再生します。

「SourceId」列には、documentationとして使用するオーディオ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(); 
} 
関連する問題