나는 모든 오디오 및 비디오 파일 (SD 카드에 있음)을 안드로이드 ListView
에 나열한 작은 프로그램을 작성했습니다. AsyncTask
안에 CursorLoader
을 사용하여 MediaStore
을 쿼리 한 다음 결과 데이터로 내 ListView
을 채 웁니다. 프로그램이 잘 작동하고 있습니다.ListView의 오디오 및 비디오 파일 나열
내 문제는 내가 앱을 실행할 때마다 미디어 목록을 만드는 데 꽤 오랜 시간이 걸린다는 것입니다. 이해합니다. 집중적 인 데이터베이스 쿼리 때문입니다. 그러나 모든 미디어 파일을 처음으로 스캔하는 일부 애플리케이션 (스톡 미디어 플레이어, MX 플레이어 등)을 보았습니다 (어느 정도 소요될 수 있습니다). 그 후 앱이 다시 시작되면 미디어 목록이 거의 즉시 팝업됩니다. 어떻게하면 될까요? 내 AsyncTask
의 doInBackground
내에서이 메서드를 호출하고있어
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();
}
:
@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;
}
어떤 도움을 주시면 감사하겠습니다 여기 내 방법입니다! 미리 감사드립니다!