查询整个Media Store时获取AUDIO_ID

时间:2013-07-15 08:01:01

标签: android mediastore

在知道_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_ID时无法获取MediaStore.Audio.Media.EXTERNAL_CONTENT_URI列?有没有办法检索它? (任何变通方法赞赏)

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

谢谢:)

修改

我发现一个问题的解决方案接近我正在搜索的内容(它可以获得AUDIO_ID),但它打算列出来自某个播放列表的所有音频文件。虽然我关注的是查询AUDIO_ID的整个媒体商店,无论他们是哪个播放列表。

Given an Android music playlist name, how can one find the songs in the playlist?

1 个答案:

答案 0 :(得分:4)

我使用MediaStore.Audio.MediaMediaStore.Audio.Playlists.Members数据库进行了一些测试。 我创建了一个小的播放列表,其中包含多次相同的歌曲,数据库看起来像这样:

播放列表数据库

+---------------------------+
|_ID | AUDIO_ID | songTitle |
+---------------------------+
|273 | 2913     | Alone     |
|274 | 1487     | Baby      |
|275 | 2913     | Alone     |
|276 | 2913     | Alone     |
|277 | 1487     | Baby      |
|278 | 2648     | Battery   |
+---------------------------+

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

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

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

媒体数据库

+-------------------+
|_ID  | songTitle   |
+-------------------+
|      ....         |
|1487 | Baby        |
|      ....         |
|2648 | Battery     |
|     ....          |
|2913 | Alone       |
|     ....          |
+-------------------+

似乎_ID中的MediaStore.Audio.Media标识符用作全局唯一标识符,在AUDIO_ID数据库中称为MediaStore.Audio.Playlists.Members

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