我希望使用MediaStore获取手机上的所有艺术家姓名;我已经拥有整个列表,但由于多个链接歌曲/艺术家,所有条目都有重复。有没有办法使用查询只获取其中一个,没有任何重复?
有我的疑问:
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
String[] projection = {
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DURATION
};
Cursor cursor = context.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
null,
null);
提前致谢!
答案 0 :(得分:4)
对于仍在寻找答案的人,我建议您执行以下操作:
String[] mProjection =
{
MediaStore.Audio.Artists._ID,
MediaStore.Audio.Artists.ARTIST,
MediaStore.Audio.Artists.NUMBER_OF_TRACKS,
MediaStore.Audio.Artists.NUMBER_OF_ALBUMS
};
Cursor artistCursor = mContentResolver.query(
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
mProjection,
null,
null,
MediaStore.Audio.Artists.ARTIST + " ASC");
现在您可以查询此光标以获取所有艺术家的名称。不会有任何重复 我知道这不是“从MediaStore获取唯一值”的解决方案。但它会解决这个非常具体的问题。
<强>解释强>:
您只需要查询正确的表,在本例中是“Artist
”表,而操作系统正在查询“Media
”表。
希望这有助于某人。
答案 1 :(得分:2)
在查询中使用关键字DISTINCT返回非重复值 例如,在查询许多音频编号时仅列出专辑名称
new String[] { "DISTINCT " + MediaStore.Audio.Playlists.Members.ALBUM_ID + " as _id"}
但我发现你只能返回一列
我保持简单,并在循环光标时执行以下操作。传递价值,就艺术家而言,
if (value.length() > 0) {
// check if value already exists
if (!listItems.contains(value)) {
// doesn't exist, add it
listItems.add(value);
}
}
这是一种简单的方法。 您可以在我的Google Play应用播放列表管理器中查看此信息。我使用这种技术来选择艺术家,年份等。
答案 2 :(得分:0)
为了避免这个问题,我在创建表时使用了关键字“UNIQUE”。
答案 3 :(得分:0)
public ArrayList getAlbumList(){
ArrayList<SongBeen> albumList=new ArrayList<SongBeen>();
ContentResolver musicResolver = activity.getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
if(musicCursor!=null && musicCursor.moveToFirst()){
int titleColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.ARTIST);
int albumColumn = musicCursor.getColumnIndex
(android.provider.MediaStore.Audio.Media.ALBUM);
//add songs to list
do {
SongBeen been=new SongBeen();
been.setId(musicCursor.getLong(idColumn));
been.setAlbum(musicCursor.getString(albumColumn));
been.setArtist(musicCursor.getString(artistColumn));
albumList.add(been);
}
while (musicCursor.moveToNext());
}
return albumList;
}