我有一个Android应用程式,可以收听音乐广播。它使用以下ApplicationManifest.xml(代码段)接收曲目更改通知:
<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>
当我从运行默认(内置)Google Play音乐应用程序的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,可以通过手动检查找出该ID)。INTERNAL_CONTENT_URI只是给我内置的东西(如铃声等)-所有ID都小于100,因此也没有用。
2)我对所有媒体对象进行了相同的查询-使用
MediaStore.Files.getContentUri("external")
。我得到了很多结果,但是ID 3399
是newsrob(RSS阅读器)缓存的随机文件,因此显然不相关。 最佳答案
看一下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);
我想我不需要说其他话。 :) 希望这可以帮到你。