在知道_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?
答案 0 :(得分:4)
我使用MediaStore.Audio.Media
和MediaStore.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
对于每首歌曲应该是全局唯一的。