Я написал небольшую программу, в которой перечислены все аудио и видео файлы (присутствующие на SD-карте) в андроиде ListView
. Я использую CursorLoader
внутри AsyncTask
, чтобы запросить MediaStore
, а затем заполнил мои ListView
данными о результатах. Программа работает нормально.Список аудио- и видеофайлов в ListView
Моя проблема в том, что каждый раз, когда я запускаю приложение, для создания списка носителей требуется довольно много времени. Я понимаю, это из-за интенсивного запроса к базе данных. Тем не менее, я видел некоторые приложения (например, медиаплеер, проигрыватель MX и т. Д.), Которые сканируют все медиафайлы только в первый раз (что может занять некоторое время). После этого, когда приложение запускается снова, список носителей появляется почти мгновенно. Как я могу это достичь? Вот мой подход:
private void loadAudio() {
Uri uri1 = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection1 = MediaStore.Audio.Media.IS_MUSIC + "!= 0";
String sortOrder1 = MediaStore.Audio.Media.TITLE + " ASC";
ContentResolver cr1 = getBaseContext().getContentResolver();
Cursor cur1 = cr1.query(uri1, null, selection1, null, sortOrder1);
int count1 = 0;
if (cur1 != null) {
count1 = cur1.getCount();
if (count1 > 0) {
while (cur1.moveToNext()) {
String audioPath = cur1.getString(cur1
.getColumnIndex(MediaStore.Audio.Media.DATA));
//File tempfile = new File(audioPath);
long albumId = cur1.getLong(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
String artist = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String album = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
String track = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String data = cur1.getString(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
int duration = cur1.getInt(cur1.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
final Uri ART_CONTENT_URI = Uri.parse("content://media/external/audio/albumart");
Uri albumArtUri = ContentUris.withAppendedId(ART_CONTENT_URI, albumId);
Bitmap albumartbitmap = null;
try {
albumartbitmap = MediaStore.Images.Media.getBitmap(getBaseContext().getContentResolver(), albumArtUri);
} catch (Exception exception) {
// log error
}
audioList.add(new AudioData(albumId, artist, album, track, data, duration, albumartbitmap, audioPath));
}
}
}
cur1.close();
}
Я звоню этот метод внутри doInBackground
из моих AsyncTask
:
@Override
protected Void doInBackground(Void... params) {
Looper.prepare();
loadVideo(); //Query media-store and build video list. populate mediaList
loadAudio(); //Query media-store and build audio list. populate audioList
return null;
}
Любая помощь будет оценен по достоинству! Заранее спасибо!