1

在知道 _ID 和 AUDIO_ID 之间的区别(What is difference between _ID and AUDIO_ID column?)后,我将查询更改为使用 AUDIO_ID,但是我在这里遇到了一些问题。

这是我的代码片段,旨在查询外部存储中的所有音频文件,并为每个带有嵌入式 AUDIO_ID 的音频文件制作“音乐”实例。

Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor cur = mContentResolver.query(uri, null, 
    MediaStore.Audio.Media.IS_MUSIC + " = 1", null, null);

int artistColumn = cur.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int titleColumn = cur.getColumnIndex(MediaStore.Audio.Media.TITLE);
int idColumn = cur.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID);

// All of the above columns return the right integers, 
// except idColumn which returns -1 thus making my further code below throws an exception

do{
    Music music = new Music(); // it's my music class
    music.setArtist( cur.getString(artistColumn) );
    music.setTitle( cur.getString(titleColumn) );
    music.setId( cur.getLong(idColumn) ); // error here, because idColumn = -1 (column not found)

    // ......
} while (cur.moveToNext())

为什么查询时无法获取该AUDIO_IDMediaStore.Audio.Media.EXTERNAL_CONTENT_URI?有没有办法找回它?(任何解决方法表示赞赏)

我需要它,因为我的应用程序需要绝对引用音频文件,如此处的答案评论中所述-> https://stackoverflow.com/a/17648131/670623

谢谢 :)

编辑

我发现了一个与我正在搜索的解决方案接近的问题(它可以获取 AUDIO_ID),但它旨在列出来自某些播放列表的所有音频文件。虽然我担心的是在整个媒体存储中查询 AUDIO_ID,无论它们来自哪个播放列表。

给定一个 Android 音乐播放列表名称,如何在播放列表中找到歌曲?

4

1 回答 1

4

我对MediaStore.Audio.MediaMediaStore.Audio.Playlists.Members数据库做了一些测试。我创建了一个包含多次相同歌曲的小播放列表,数据库如下所示:

播放列表数据库

+---------------+
|_ID | 音频_ID | 歌名 |
+---------------+
|273 | 2913 | 一个人 |
|274 | 第1487章 宝贝 |
|275 | 2913 | 一个人 |
|276 | 2913 | 一个人 |
|277 | 第1487章 宝贝 |
|278 | 2648 | 电池 |
+---------------+

正如预期的那样_ID,这是该播放列表中的本地唯一标识符。当然,可能还有其他几个具有自己_ID标识符的播放列表。AUDIO_ID不能用于标识此数据库中的特定行,因为同一首歌曲可以在单个播放列表中出现多次。

AUDIO_ID是全局唯一标识符,对于某首歌曲始终相同。

现在让我们看一下MediaStore.Audio.Media数据库。在这里,存储了 MediaStore 系统已知的所有歌曲。(这只是摘录)

媒体数据库

+-------------------+
|_ID | 歌名 |
+-------------------+
| .... |
|1487 | 宝贝 |
| .... |
|2648 | 电池 |
| .... |
|2913 | 一个人 |
| .... |
+-------------------+

似乎_IDin 的标识符MediaStore.Audio.Media被用作AUDIO_IDMediaStore.Audio.Playlists.Members数据库中调用的全局唯一标识符。

乍一看这似乎很奇怪,但每首歌都必须包含在MediaStore.Audio.Media其中,并且只能出现一次。并且由于只有一个这样的数据库,_ID因此该数据库中的每首歌曲都应该是全球唯一的。

于 2014-06-05T21:01:03.990 回答