Mediastore 查询简化
Mediastore Query Simplification
我正在尝试使用 Mediastore 获取设备中的所有音乐文件。
我正在异步检索所有文件,但获取所有歌曲需要 6-7 秒,因此在此期间用户必须看到不确定的进度条。
我在查询中使用查询来检索每首歌曲的专辑封面
有没有什么方法或者更好的方法来处理
public ArrayList<SongList> getSongs() {
ContentResolver musicResolver = context.getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, new String[] {MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media._ID
,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.COMPOSER,MediaStore.Audio.Media.YEAR,MediaStore.Audio.Media.TRACK
}, null, null, MediaStore.Audio.Media.TITLE);
if (musicCursor != null && musicCursor.moveToFirst()) {
//int value=0;
//get columns
int titleColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ARTIST);
int pathColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.DATA);
int albumColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM);
int albumIDColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM_ID);
int composerColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.COMPOSER);
int yearColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.YEAR);
int trackColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.TRACK);
String thisAlbumArt = "";
//add songs to list
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
String thisArtist = musicCursor.getString(artistColumn);
String thisPath = musicCursor.getString(pathColumn);
String thisAlbum = musicCursor.getString(albumColumn);
long thisalbumID = musicCursor.getLong(albumIDColumn);
String thisComposer = musicCursor.getString(composerColumn);
int thisyear = musicCursor.getInt(yearColumn);
int track = musicCursor.getInt(trackColumn);
songQueryList.add(thisTitle);
Cursor cursor = musicResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=?",
new String[]{musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))},
null);
if (cursor!=null && cursor.moveToFirst()) {
thisAlbumArt = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
cursor.close();
}
if(thisPath.endsWith(".mp3")|| thisPath.endsWith(".m4p") || thisPath.endsWith(".wav") ) {
songs.add(new SongList(thisId, thisTitle, thisAlbum, thisArtist, thisPath, thisAlbumArt ,thisyear,track ,thisComposer ,thisalbumID));
}
else{
}
//cursor.moveToNext();
}
while (musicCursor.moveToNext());
}
if(musicCursor!=null) {
musicCursor.close();
}
//Log.e("HI"," "+musicCursor.isClosed());
/*Collections.sort(songs, new Comparator<SongList>(){
public int compare(SongList a, SongList b){
return a.getTitle().compareToIgnoreCase(b.getTitle());
}
});*/
return songs;
}
先谢谢你
我发现 solution.Actually 这几行代码导致了我在 do-while
循环中调用的延迟-
Cursor cursor = musicResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=?",
new String[]{musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))},
null);
我想补充一点,查询游标是一条非常昂贵且耗时的线路,因此多次使用它会导致延迟。
相反,我对 SONG、ALBUM 和 ARTIST 使用了 3 种不同的查询,然后使用一些逻辑将它们相互关联。
希望这对您有所帮助。
快乐编码。
这里有2种检索方式,第一种使用专辑ID,第二种使用歌曲ID。
// requires WRITE_EXTERNAL_STORAGE on N+
public void loadAlbumArt(int albumId, ImageView view){
Uri artworkUri = Uri.parse("content://media/external/audio/albumart");
Uri path = ContentUris.withAppendedId(artworkUri, albumId);
Glide.with(view.getContext()).load(path).into(view);
}
public static void loadAlbumArt(int songId, ImageView view){
Uri artworkUri = Uri.parse("content://media/external/audio/media/" + songId + "/albumart");
Glide.with(view.getContext()).loadFromMediaStore(artworkUri).into(view);
}
我正在尝试使用 Mediastore 获取设备中的所有音乐文件。 我正在异步检索所有文件,但获取所有歌曲需要 6-7 秒,因此在此期间用户必须看到不确定的进度条。
我在查询中使用查询来检索每首歌曲的专辑封面
有没有什么方法或者更好的方法来处理
public ArrayList<SongList> getSongs() {
ContentResolver musicResolver = context.getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, new String[] {MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media._ID
,MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.ALBUM,MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.COMPOSER,MediaStore.Audio.Media.YEAR,MediaStore.Audio.Media.TRACK
}, null, null, MediaStore.Audio.Media.TITLE);
if (musicCursor != null && musicCursor.moveToFirst()) {
//int value=0;
//get columns
int titleColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ARTIST);
int pathColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.DATA);
int albumColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM);
int albumIDColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.ALBUM_ID);
int composerColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.COMPOSER);
int yearColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.YEAR);
int trackColumn = musicCursor.getColumnIndex
(MediaStore.Audio.Media.TRACK);
String thisAlbumArt = "";
//add songs to list
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
String thisArtist = musicCursor.getString(artistColumn);
String thisPath = musicCursor.getString(pathColumn);
String thisAlbum = musicCursor.getString(albumColumn);
long thisalbumID = musicCursor.getLong(albumIDColumn);
String thisComposer = musicCursor.getString(composerColumn);
int thisyear = musicCursor.getInt(yearColumn);
int track = musicCursor.getInt(trackColumn);
songQueryList.add(thisTitle);
Cursor cursor = musicResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=?",
new String[]{musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))},
null);
if (cursor!=null && cursor.moveToFirst()) {
thisAlbumArt = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
cursor.close();
}
if(thisPath.endsWith(".mp3")|| thisPath.endsWith(".m4p") || thisPath.endsWith(".wav") ) {
songs.add(new SongList(thisId, thisTitle, thisAlbum, thisArtist, thisPath, thisAlbumArt ,thisyear,track ,thisComposer ,thisalbumID));
}
else{
}
//cursor.moveToNext();
}
while (musicCursor.moveToNext());
}
if(musicCursor!=null) {
musicCursor.close();
}
//Log.e("HI"," "+musicCursor.isClosed());
/*Collections.sort(songs, new Comparator<SongList>(){
public int compare(SongList a, SongList b){
return a.getTitle().compareToIgnoreCase(b.getTitle());
}
});*/
return songs;
}
先谢谢你
我发现 solution.Actually 这几行代码导致了我在 do-while
循环中调用的延迟-
Cursor cursor = musicResolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART},
MediaStore.Audio.Albums._ID + "=?",
new String[]{musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID))},
null);
我想补充一点,查询游标是一条非常昂贵且耗时的线路,因此多次使用它会导致延迟。
相反,我对 SONG、ALBUM 和 ARTIST 使用了 3 种不同的查询,然后使用一些逻辑将它们相互关联。
希望这对您有所帮助。 快乐编码。
这里有2种检索方式,第一种使用专辑ID,第二种使用歌曲ID。
// requires WRITE_EXTERNAL_STORAGE on N+
public void loadAlbumArt(int albumId, ImageView view){
Uri artworkUri = Uri.parse("content://media/external/audio/albumart");
Uri path = ContentUris.withAppendedId(artworkUri, albumId);
Glide.with(view.getContext()).load(path).into(view);
}
public static void loadAlbumArt(int songId, ImageView view){
Uri artworkUri = Uri.parse("content://media/external/audio/media/" + songId + "/albumart");
Glide.with(view.getContext()).loadFromMediaStore(artworkUri).into(view);
}