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

Flutter用taskpicture、GallerySaver存图显示0kb需补充什么权限?

问题定位与解决方案

首先澄清:日志里的「Access denied finding property "persist.camera.cfa.packagelist"」是安卓系统相机服务的常规权限校验提示,属于无关噪音,和图片0kb的问题没有因果关系,不需要针对这个日志做特殊适配。
真正导致Pictures目录出现0kb占位文件、但相册能正常打开预览的核心原因,是高版本Android系统的分区存储规则对存储写入流程的静默拦截,和当前权限配置不全、代码流程缺少校验有关。

必须补充的权限配置

现有Manifest中注册的两个存储权限,在Android 10及以上版本已经无法覆盖正常存图的需求,需要补充以下配置:

  • 针对Android 10(API 29)版本,在<application>节点添加兼容标记,关闭强制分区存储拦截:
    <application
        android:requestLegacyExternalStorage="true"
        ...>
    
    缺少这个配置时,系统会直接拦截应用向公共目录的写入操作,不会抛出明确的异常,只会生成0kb的占位文件,这是最常见的踩坑点。
  • 针对Android 11(API 30)及以上版本,原有的WRITE_EXTERNAL_STORAGE权限已经完全失效,需要在Manifest中新增注册两个权限:
    <!-- 全量文件访问权限,适配高版本系统的公共目录写入要求 -->
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
    <!-- 安卓13及以上的媒体图片访问专属权限 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
    
  • 权限不能只在Manifest静态注册:Android 6.0以上系统需要在调用存图逻辑前,主动触发运行时权限申请弹窗,其中MANAGE_EXTERNAL_STORAGE权限需要跳转到系统专属的设置页面引导用户手动授权,否则所有写入操作都会被系统静默拦截。

配套的代码流程修正

光补权限仍可能出现0kb的问题,需要调整现有拍照存图的逻辑漏洞:

  • 当前代码中通过getExternalStorageDirectory()获取的路径是App专属的私有外部存储目录,这个目录下的文件不会被系统媒体库自动扫描,GallerySaver.saveImage()本质是执行将私有目录文件拷贝到公共媒体库的流程,当拍照接口返回后文件尚未写入完成、或者跨目录拷贝流程被系统拦截时,就会出现媒体库生成了0kb的占位条目,但实际图片数据没有写入的问题。
  • 调整逻辑:拍照完成后先通过File(path).length()校验临时文件大小,确认大于0、图片数据完整写入后,再调用GallerySaver.saveImage()同步到公共相册。
  • 不要将App私有路径下的文件直接作为公共目录的存图路径,临时文件建议直接放在系统Pictures公共目录下完成拍照写入,减少跨目录拷贝的拦截概率。

注意:不要为了适配高版本权限随意降低App的targetSdkVersion,否则会影响应用上架的合规性,优先通过上述权限配置适配新规则。

内容的提问来源于stack exchange,提问作者denis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 10:54:02