2013-02-27 22 views
1

我有一個聽音樂廣播的android應用程序。它接收使用以下ApplicationManifest.xml(段)軌道變更通知:Android「Google Play音樂」廣播意圖中的「ID」字段對應的是什麼?

<receiver android:name=".music.AndroidMusicBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="com.android.music.metachanged"/> 
      <action android:name="com.android.music.playbackcomplete"/> 
      <action android:name="com.android.music.playstatechanged"/> 
      <action android:name="com.htc.music.metachanged"/> 
      <action android:name="com.htc.music.playbackcomplete"/> 
      <action android:name="com.htc.music.playstatechanged"/> 
     </intent-filter> 
    </receiver> 

當我從我的Nexus 4運行默認(內置)這個廣播意圖谷歌播放音樂應用,捆綁有一些有用的信息關於當前正在播放的曲目,包括「藝術家」和「標題」。它有一個文件路徑,我想。但它確實有一個「id」字段(long),這讓我覺得我可以使用該ID作爲關鍵字來查找附加信息。但我無法弄清楚:什麼數據庫/內容提供者是這個ID的關鍵?


事情我試過到目前爲止:

1)我本來期望這對應於內容解析器的_ID領域之一:

  • MediaStore.Audio。 Media.INTERNAL_CONTENT_URI
  • MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

但我可試圖查詢這兩個,並且ID不在同一個球場。我目前的例子是,我得到了3399的「id」(在廣播中)。但是,查詢EXTERNAL_CONTENT_URI中的所有曲目會給我提供20865-23051範圍內的ID以及幾個小ID(20和24,對應於由Google +應用程序安裝的通知和鈴聲)。

對於這個來源,當前正在播放的曲目的ID將是21373(我根據路徑查找ID,這可以通過手動檢查得出)。

INTERNAL_CONTENT_URI只是給我內置的東西(如鈴聲等) - 所有的ID都是< 100,所以這也沒有用。

2)我做了與所有媒體對象相同的查詢 - 使用MediaStore.Files.getContentUri("external")。我收到了很多結果,但ID 3399是由newsrob(一個RSS閱讀器)緩存的隨機文件,所以這顯然不相關。

+0

使用gmusic-playlist(這是一個將Google Play音樂(網絡服務)播放列表信息導出爲CSV的Tampermonkey腳本,請在此處獲取:https://github.com/soulfx/gmusic-playlist.js)。我看到ID重複播放不同的歌曲。很奇怪。似乎還有七種不同的「idtype」,並且這些在某些情況下對應於不同的ID格式。這些可能與那些用於Google Play音樂的Android應用程序中的應用程序相對應嗎? – Jon 2016-05-07 16:51:54

+0

更正:它們對每個軌道都是唯一的。我的排序有一個錯誤。 – Jon 2016-05-07 17:01:28

回答

1

看看源代碼MediaPlaybackService.java:

private void notifyChange(String what) { 

    Intent i = new Intent(what); 
    i.putExtra("id", Long.valueOf(getAudioId())); 
    i.putExtra("artist", getArtistName()); 
    i.putExtra("album",getAlbumName()); 
    i.putExtra("track", getTrackName()); 
    i.putExtra("playing", isPlaying()); 
    ... 
} 

/** 
* Returns the rowid of the currently playing file, or -1 if 
* no file is currently playing. 
*/ 
public long getAudioId() { 
    synchronized (this) { 
     if (mPlayPos >= 0 && mPlayer.isInitialized()) { 
      return mPlayList[mPlayPos]; 
     } 
    } 
    return -1; 
} 

對ContentProvider的某些代碼:

Cursor crsr = MusicUtils.query(this, 
        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
        new String [] {"_id"}, "_id=" + mPlayList[mPlayPos] , null, null); 

我覺得我不需要說些什麼。 :) 希望這可以幫到你。

+0

感謝您的指點,我忘記了源可能可用。我使用的是「Google Play音樂」,我忘記了它可能是相關的。我懷疑這不是基於開放源代碼,因爲我的廣播意圖收到的密鑰與假設發送的密鑰有差異(不是最後一個是ID不匹配,應該是這樣!)。 。所以雖然這是一個很好的答案,但我已經更新了我的問題,專門針對Google Play音樂。 – gfxmonk 2013-02-28 10:19:20

+0

您是否使用id而不是_id從EXTERNAL_CONTENT_URI中選擇? – StarPinkER 2013-02-28 10:35:04

+0

我使用MediaStore.Audio.Media._ID,但也嘗試了迷信中的文字「_id」 - 相同的結果。 – gfxmonk 2013-02-28 11:56:08

相關問題