之前写过一篇关于从零开始把小番茄图片混淆做成安卓App的文章,自己使用过程中需要处理多张图。 确实,上一版只能一张一张选。想混淆一堆图的时候,要重复选图、处理、保存很多轮,来回折腾效率很低。

这次把批量模式加上了。这篇文章记录的不是最终效果,而是怎么加的、踩了什么坑、怎么填的。如果也在做类似的功能迭代,或者刚入门安卓开发想看看一个功能是怎么一步步落地的,这篇应该能提供一些参考。
批量功能做了什么
先明确功能边界:
一次选多张图,统一加密或解密,批量保存

操作流程:
点击"选择图片",弹窗提示"选择多张图片"
进入系统相册,长按任意图片进入多选模式,勾选需要的图片
选完返回App,加载图片列表,显示第一张预览和当前序号(比如"1/10")
调节混淆次数(1-99次),点击"加密"或"解密"
后台逐张处理,进度条显示当前进度和文件名
全部处理完后,出现"一键保存"按钮,点击后一次性保存所有结果到相册
通过"上一张/下一张"浏览处理结果,可以随时"还原"某张图回到原始状态
处理完一批后点击"清空列表",释放资源,退出批量模式
流程看起来顺滑,但实际开发中踩了不少坑,遇到的主要问题如下:
1. 多图内存爆炸(OOM)
单图处理时,一张4000x3000的照片加载到内存大约占48MB(4000×3000×4字节)。Android设备给单个App的内存上限一般在128MB-256MB之间,单图能扛住。
批量模式如果每张图都全尺寸加载,连续处理几张后内存峰值可能超过200MB,低端手机直接闪退。
解决思路:
第一,逐张处理,不保留历史。 处理循环里每张图加载→处理→保存缓存→立即回收Bitmap,然后加载下一张。同一时刻内存里最多只有一张原图和一张结果图。
第二,预览图采样加载。 预览时不显示原图尺寸,只加载缩略图。用inSampleSize控制采样率,把图片缩放到屏幕宽高范围内。
val options = BitmapFactory.Options().apply {
inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight)
}
BitmapFactory.decodeFile(path, options)
第三,处理结果存文件不存内存。 处理完的图片以PNG格式缓存在cacheDir里,预览时再从文件加载(同样采样加载)。不管处理多少张,内存里永远只有当前预览的一张。
bitmap?.recycle()
这三层做完后,一次处理30张图内存也能稳定在安全范围内。
2. 保存后相册里看不到图片
刚开始保存逻辑用的是传统写法:直接把文件写到Pictures/NoiseVault目录下。文件确实写进去了,文件管理器能看得到,但系统相册刷不出来。
查了文档才发现,Android 10以后分区


151

被折叠的 条评论
为什么被折叠?



