6

我遇到了將音樂集成到我的Android應用程序中的障礙。我們的目標只是讓用戶通過Google Play音樂(或任何其他播放器,如Winamp,Poweramp,doubleTwist等)看到&已播放的歌曲。如何讓用戶在Android上查看和播放他們已有權訪問的歌曲(例如,通過Google Play)?

到目前爲止,我已經嘗試了幾個方法,但每個人都有問題。

方法1:使用ContentResolver的查詢以獲得來自谷歌播放&歌曲播放音樂,然後播放使用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); 

這窩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:調用谷歌播放音樂,或其他播放器,使用使用意圖的意圖

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的一部分,可能會在沒有警告的情況下更改。

我想要實現的基本功能存在於iOS的,這要歸功於與iTunes緊密集成。我認爲谷歌希望實現同樣的整合,因爲它可能意味着在Play商店銷售更多音樂。

總結:是否有可能讓用戶看到&播放歌曲到他們已經在Android的訪問?使用Google Play音樂或任何其他應用程序執行此操作的最佳方法是什麼?謝謝。

+1

更新:直到我找到一個很好的答案與谷歌整合播放音樂或其他音樂播放器,我剛剛研製讀取和播放設備上本地存儲的音樂文件的接口(使用ContentResolver的查詢找到歌曲和MediaPlayer播放它們)。這似乎工作正常,但它留給用戶將MP3和其他音樂文件移動到設備上。我仍然希望找到一種解決方案,通過提供與流行音樂播放器的良好集成,讓所有人都變得輕鬆....任何人? – gcl1

+0

我認爲你的方法#1應該工作,如果你獲得對應於所選曲目的流式傳輸網址並將其傳遞給MediaPlayer。 –

+0

當我最後一次在12月嘗試時,我無法做出第一種方法。但是我會很感興趣知道你是否真的做到了。與此同時,正如我在UPDATE評論中所說的,我只是讓用戶播放本地存儲在設備上的音樂。謝謝。 – gcl1

回答

1

方法#1還挺工作,感謝OP的方向(與當地的音樂設備上測試)。

注:

  • 我們正在與這裏的無證內部API玩 - 這不是 可靠。
  • 我沒有訪問在線/購買的音樂在谷歌 播放音樂,這樣的回答是指僅在本地存儲的音樂。

下面的代碼將迭代播放列表中的所有歌曲並播放最後一個。

注意「的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(); 
} 
相關問題