安卓上快速扫描SD卡

3
我正在尝试编写一种最快的扫描整个SD卡的算法。我要实现的是类似于QuickPic的东西,它可以进行“正常速度”的SD卡初始扫描,但是任何后续刷新都非常快。
我试过了几种方法,并且还有一些我尚未测试的想法:
1)始终扫描整个SD卡。我试过了这个...它的初始扫描速度有点慢。但所有后续扫描都更快,但不像 QuickPic 那样快。
2)在初始扫描后添加FileObserver到所有文件夹。虽然这只会增加应用程序的大约1 MB的内存,但我担心这会影响性能甚至耗电,因为它必须一直运行。而且,我的SD卡上有数据库,我不断地获取日志文件被创建/删除的事件。我确定在使用其他应用程序时,将会有其他文件夹/文件需要我不断获取通知。不确定这是否对性能有好处。
3)使用MediaStore中的数据。不幸的是,在我的HTC Desire手机上,媒体库与SD卡上的内容并不总是同步更新(不确定为什么),但这还不够好。
4)使用ContentObserver。我还没有尝试过这个,必须检查文档,但我有一种感觉,如果MediaStore没有将图像保存在其数据库中,则我也无法从ContentObserver中获取它。
你们还有其他建议吗?基本上,我的需求是要在某个时间点知道SD卡上的所有图像文件。初始扫描可能需要花费一些时间,后续扫描应尽可能快(我知道这取决于SD卡上的文件夹/文件数),但QuickPic可以在约0.6-0.8秒内扫描整个SD卡,而我只能做得非常慢。
1个回答

0

像QuickPic这样的真正应用程序无疑是使用MediaStore作为它们的源。以下是一个示例,可以在MediaStore中查找所有外部图像文件及其缩略图。

请注意,MediaStore中的DATA列是指文件的完整路径。

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import androidx.loader.content.CursorLoader;
import java.io.IOException;
import java.util.ArrayList;

class ImageFileInfo
{
    ImageFileInfo(String fileFullPath, Bitmap image, Bitmap thumbnail)
    {
        this.fileFullPath = fileFullPath;
        this.image = image;
        this.thumbnail = thumbnail;
    }

    String fileFullPath;
    Bitmap image;
    Bitmap thumbnail;
}

public class GetImageInfos
{
    static ArrayList<ImageFileInfo> getImageInfos(Context context)
    {
        ArrayList<ImageFileInfo> list = new ArrayList<>();

        final String[] cols = {
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DATA };

        CursorLoader loader = new CursorLoader(context);
        loader.setUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        loader.setProjection(cols);
        loader.setSelection(null);
        loader.setSortOrder(MediaStore.Images.Media.DATA);
        Cursor cursor = loader.loadInBackground();

        ContentResolver resolver = context.getContentResolver();

        for (int i = 0; i < cursor.getCount(); i++)
        {
            cursor.moveToPosition(i);

            int imagePathCol = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
            String imagePath = cursor.getString(imagePathCol);

            int imageIdCol = cursor.getColumnIndex(MediaStore.Images.Media._ID);
            int imageId = cursor.getInt(imageIdCol);

            Bitmap image = BitmapFactory.decodeFile(imagePath);

            Bitmap thumb = MediaStore.Images.Thumbnails.getThumbnail(
                    resolver, imageId, MediaStore.Images.Thumbnails.MINI_KIND, null);

            list.add(new ImageFileInfo(imagePath, image, thumb));
        }

        return list;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接