在ListView中列出音频和视频文件

时间:2014-12-24 09:54:31

标签: android android-listview android-asynctask android-cursor mediastore

我写了一个小程序,列出了android ListView中的所有音频和视频文件(存在于SD卡上)。我在CursorLoader内使用AsyncTask来查询MediaStore,然后使用结果数据填充我的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的{​​{1}}内调用此方法:

AsyncTask

任何帮助将不胜感激!提前谢谢!

1 个答案:

答案 0 :(得分:1)

我能想到的唯一可以让您获得更快访问时间的是使用您的结果构建内部SQL数据库。当您的应用程序打开时,它将需要查看数据库是否存在。如果不是,它将需要搜索SD卡,如果存在,您将已经将所有数据加载到sql可搜索数据库中。我仍然希望你有大量的加载时间问题或sql数据库中的结果。

如果您引用的程序有任何类型的刷新/重建'其中的选项就是我认为他们正在管理它的方式。

我能想到的唯一另一个选择是它们以某种方式将整个listview对象保存到内部文件,然后只加载文件。我知道在C ++中可以将整个类保存到文件中,但从未在Java / Android中尝试过它