1

我有一个收听音乐广播的安卓应用程序。它使用以下 ApplicationManifest.xml (snippet) 接收跟踪更改通知:

    <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”字段(a long),这让我觉得我或许可以使用该 ID 作为键来查找附加信息。但我不知道:这个 ID 是哪个数据库/内容提供商的密钥?


到目前为止我尝试过的事情:

1)我希望这对应于内容解析器的 _ID 字段之一:

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

但是我已经尝试查询这两个,并且 ID 不在同一个球场上。我目前的例子是我得到一个“id”(在广播中)3399。但是查询 EXTERNAL_CONTENT_URI 中的所有曲目会得到 20865-23051 范围内的 ID,以及几个小的 ID(20 和 24,对应于 google+ 应用程序安装的通知和铃声)。

对于这个来源,当前播放曲目的 ID 将是21373(我根据路径查找 ID,我可以通过手动检查找出)。

INTERNAL_CONTENT_URI 只是给了我内置的东西(比如铃声等)——所有的 ID 都小于 100,所以这也没有用。

2)我对所有媒体对象做了同样的查询——使用MediaStore.Files.getContentUri("external"). 我得到了很多结果,但 ID3399是由 newsrob(一个 RSS 阅读器)缓存的随机文件,所以这显然不相关。

4

1 回答 1

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

我想我不需要说别的了。:) 希望这可以帮到你。

于 2013-02-27T12:41:32.737 回答