FileOutputStream抛出异常排查:Android保存图片至DCIM失败
代码保存Bitmap失败的原因分析
你的代码抛出FileOutputStream异常,主要是以下几个核心问题导致的:
1. 权限问题(最常见原因)
- Android 6.0+ 动态权限缺失:
即便在AndroidManifest.xml中声明了<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,Android 6.0(API Level 23)及以上系统仍需动态申请权限。你的代码完全未处理权限请求流程,直接尝试写文件会因权限被拒绝抛出异常。 - Android 10+ 分区存储限制:
Android 10(API Level 29)及以上启用了分区存储机制,直接通过File类操作公共DCIM目录会被系统限制,即便拥有WRITE权限也无法直接创建文件,此时必须改用MediaStoreAPI完成公共目录的文件写入。
2. 目录创建未做有效性校验
代码中调用dir.mkdirs()后,没有检查返回值是否为true。如果因权限不足、系统限制等原因导致目录创建失败,后续初始化FileOutputStream必然会抛出FileNotFoundException,而你无法提前感知这个问题。
3. 文件流操作的不严谨性
虽然手动调用了fo.close(),但如果write()或flush()过程中抛出异常,close()可能不会执行,导致资源泄漏。更稳妥的方式是使用Kotlin的use函数(对应Java的try-with-resources)自动管理流的生命周期。
额外优化点
- PNG是无损压缩格式,
bitmap.compress(Bitmap.CompressFormat.PNG, 90, bytes)中的第二个参数(质量)无效,可改为100或忽略该参数的实际意义。 - 更新UI时使用
runOnUiThread,建议替换为withContext(Dispatchers.Main),更符合Coroutine的使用规范。
内容的提问来源于stack exchange,提问作者Aditya Jha
相关产品推荐
相关产品推荐

