Android 什么是;id";安卓系统中的字段“;谷歌播放音乐“;广播意图对应于什么?

Android 什么是;id";安卓系统中的字段“;谷歌播放音乐“;广播意图对应于什么?,android,broadcastreceiver,playback,Android,Broadcastreceiver,Playback,我有一个安卓应用程序,可以收听音乐广播。它使用以下ApplicationManifest.xml(代码段)接收曲目更改通知: 当我从运行默认(内置)谷歌播放音乐应用程序的nexus 4中获得此广播意图时,该捆绑包包含有关当前播放曲目的有用信息,包括“艺术家”和“标题”。它没有我想要的文件路径。但它确实有一个“id”字段(一个长的),这让我觉得我或许可以使用该id作为键来查找其他信息。但我不知道:这个ID是哪个数据库/内容提供商的密钥 到目前为止我已经尝试过的事情: 1) 我希望这与以下内容

我有一个安卓应用程序,可以收听音乐广播。它使用以下ApplicationManifest.xml(代码段)接收曲目更改通知:


当我从运行默认(内置)谷歌播放音乐应用程序的nexus 4中获得此广播意图时,该捆绑包包含有关当前播放曲目的有用信息,包括“艺术家”和“标题”。它没有我想要的文件路径。但它确实有一个“id”字段(一个
长的
),这让我觉得我或许可以使用该id作为键来查找其他信息。但我不知道:这个ID是哪个数据库/内容提供商的密钥


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

1) 我希望这与以下内容解析器的_ID字段相对应:

  • MediaStore.Audio.Media.INTERNAL\u CONTENT\u URI
  • MediaStore.Audio.Media.EXTERNAL\u内容\u URI
但我试着查询这两个,而ID却不在同一个范围内。我目前的例子是,我得到了一个
3399
的“id”(在广播中)。但是查询外部内容URI中的所有曲目会给我20865-23051范围内的ID,再加上几个小ID(20和24,对应于google+应用程序安装的通知和铃声)

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

内部内容只是给了我一些内置的东西(比如铃声等等)——所有的ID都<100,所以这也没用


2) 我使用
MediaStore.Files.getContentUri(“外部”)
对所有媒体对象执行了相同的查询。我得到了很多结果,但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);

我想我不需要再说别的了希望这能帮助你

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

我想我不需要再说别的了希望这能帮助你

谢谢你的提示,我忘记了源代码可能是可用的。我用的是“谷歌音乐”,我忘了这可能是相关的。我怀疑这不是基于开源代码,因为我的广播意图接收到的密钥和应该发送的密钥之间存在差异(不是最后一个是ID不匹配!)。所以,虽然这是一个很好的答案,但我已经更新了我的问题,专门针对Google Play Music。您是否使用id而不是_id从外部内容_URI中进行选择?我使用了MediaStore.Audio.Media._id,但出于迷信,还尝试了文字“_id”-同样的结果。我在emulator上测试了它,它可以工作,所以我认为这可能是HTC特有的问题。在图像上也显示了类似的问题。我启动了一个模拟器,它有一个常规的音乐应用程序,而不是“谷歌播放音乐”,所以是的,我认为它一定是特定于此(虽然与HTC无关,但这是谷歌Nexus 4-我希望谷歌不会那么奇怪)。感谢指针,我忘记了源代码可能是可用的。我用的是“谷歌音乐”,我忘了这可能是相关的。我怀疑这不是基于开源代码,因为我的广播意图接收到的密钥和应该发送的密钥之间存在差异(不是最后一个是ID不匹配!)。所以,虽然这是一个很好的答案,但我已经更新了我的问题,专门针对Google Play Music。您是否使用id而不是_id从外部内容_URI中进行选择?我使用了MediaStore.Audio.Media._id,但出于迷信,还尝试了文字“_id”-同样的结果。我在emulator上测试了它,它可以工作,所以我认为这可能是HTC特有的问题。在图像上也显示了类似的问题。我启动了一个模拟器,它有常规的音乐应用程序,而不是“Google Play Music”,所以是的,我认为它一定是特定于此(虽然与HTC无关,但这是一个Google Nexus 4-我希望Google不会那么奇怪)(网络服务)播放列表信息为CSV。在这里获取:)。我看到ID在不同的歌曲中重复。非常奇怪。还有七种不同的“ID类型”s和这些在某些情况下对应于不同的ID格式。这些可能对应于Android应用程序中用于Google Play Music的ID格式吗?更正:它们对每首曲目都是唯一的。我的排序有一个错误。使用gmusic playlist(这是一个导出Google Play Music(web服务)的Tampermonkey脚本)播放列表信息为CSV。在这里获取:)。我看到ID在不同的歌曲中重复。非常奇怪。还有七种不同的“ID类型”s和这些在某些情况下对应于不同的ID格式。这些可能对应于Android应用程序中用于Google Play Music的ID格式吗?更正:它们对于每个曲目都是唯一的。我的排序有一个错误。