我有一个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);


我想我不需要说其他话。 :) 希望这可以帮到你。

08-18 16:45
查看更多