You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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权限也无法直接创建文件,此时必须改用MediaStore API完成公共目录的文件写入。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:05:18