Список аудио и видео файлов в ListView

Я написал небольшую программу, которая перечисляет все аудио- и видеофайлы (присутствующие на SD-карте) в файле android ListView. Я использую CursorLoader внутри AsyncTask для запроса MediaStore, а затем заполняю свой ListView данными результатов. Программа работает нормально.

Моя проблема в том, что каждый раз, когда я запускаю приложение, создание списка медиа занимает довольно много времени. Я понимаю, это из-за интенсивного запроса к базе данных. Тем не менее, я видел некоторые приложения (например, стандартный медиаплеер, MX Player и т. д.), которые сканируют все медиафайлы только в первый раз (что может занять некоторое время). После этого, когда приложение снова запускается, список мультимедиа появляется почти мгновенно. Как я могу этого добиться? Вот мой подход:

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;
    }

Любая помощь будет оценена по достоинству! Заранее спасибо!


person Vinit Shandilya    schedule 24.12.2014    source источник


Ответы (1)


Единственное, что я могу придумать, что может дать вам более быстрое время доступа, - это создать внутреннюю базу данных SQL с вашими результатами. Когда ваше приложение откроется, ему нужно будет увидеть, присутствует ли база данных или нет. В противном случае потребуется выполнить поиск на SD-карте, если она присутствует, все данные уже будут загружены в базу данных с возможностью поиска sql. Я все еще ожидаю, что у вас возникнут проблемы со временем загрузки с большим числом или результатами в базе данных sql.

Если программы, на которые вы ссылаетесь, имеют какие-либо параметры «обновления/восстановления», то я думаю, что именно так они ими управляют.

Единственный другой вариант, о котором я могу думать, это то, что они каким-то образом сохраняют весь объект списка во внутренний файл, а затем просто загружают файл. Я знаю, что сохранение всего класса в файл возможно на С++, но никогда не пробовал его на Java/Android.

person Zeppie    schedule 24.12.2014