gpt4 book ai didi

android - 在Android上快速扫描SD卡

转载 作者:行者123 更新时间:2023-12-05 00:07:42 24 4
gpt4 key购买 nike

我正在尝试编写一种算法以最快地扫描整个 SD 卡。我试图实现的是与 QuickPic 一致的东西,它具有“正常速度”的 SD 卡初始扫描,但任何后续刷新都非常快。

我已经尝试了很多东西,还有一些我没有测试过的想法

1) 始终扫描整个 SD 卡。我试过了……初始扫描时速度有点慢。但所有后续扫描都更快,但不如 QucikPic 快。

2) 初始扫描后,将 FileObserver 添加到所有文件夹。虽然它只会增加大约 1 MB 的应用程序内存,但恐怕这会影响性能甚至耗尽电池,因为它必须一直运行。另外,我在 SD 卡上有数据库,并且我不断获取创建/删除日志文件的事件。我确信在使用其他应用程序时,会有其他文件夹/文件,我会不断收到通知。不确定这在性能方面是否可行。

3) 使用 MediaStore 中的数据。不幸的是,我的 HTC Desire Media 商店似乎并不总是与 SD 卡上的内容保持同步(不知道为什么),但这还不够好。

3) 使用 ContentObserver。还没有尝试过,必须检查文档,但我有一种感觉,如果 MediaStore 的数据库中没有图像,那么我也不会从 ContentObserver 获取它。

你们还有什么建议吗?基本上我需要的是在某个时候了解 SD 卡上的所有图像文件。初始扫描可能需要更长的时间,后续扫描应该尽可能快(我知道这取决于 SD 卡上的文件夹/文件的数量)但是 QuickPic 扫描(或无论它做什么)整个 SD 卡大约需要 0.6-0.8 秒,我就是做不到那么快。

最佳答案

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

关于android - 在Android上快速扫描SD卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com