[英]Getting AUDIO_ID when querying the whole Media Store
在知道了_ID和AUDIO_ID之间的区别( _ID和AUDIO_ID列之间有什么区别? )之后,我正在改变我的查询以使用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())
查询MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
时,为什么无法获取AUDIO_ID
列? 有没有办法检索它? (任何变通方法感谢)
我需要它,因为我的应用需要绝对引用音频文件,如答案评论中所述 - > https://stackoverflow.com/a/17648131/670623
谢谢 :)
我发现一个问题的解决方案接近我正在搜索的内容(它可以获得AUDIO_ID),但是它旨在列出某些播放列表中的所有音频文件。 虽然我关注的是查询整个媒体商店的AUDIO_ID,无论他们是哪个播放列表。
我使用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 | | .... | +-------------------+
似乎MediaStore.Audio.Media
中的_ID
标识符用作全局唯一标识符,在MediaStore.Audio.Playlists.Members
数据库中称为AUDIO_ID
。
起初这看起来很奇怪,但每首歌都必须包含在MediaStore.Audio.Media
,它只能出现一次 。 由于只有一个这样的数据库,因此该数据库中的_ID
对于每首歌曲应该是全局唯一的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.