通过Storage Access Framework创建的JPEG在Android11文件应用显示0字节异常
问题根因
文件大小显示0B的问题由Android 11的DocumentsProvider元数据缓存机制导致,现有写入逻辑本身没有功能错误:
- 通过SAF调用
createFile()创建文件时,系统DocumentsProvider会初始化文件元数据,默认将大小标记为0 - 原生层直接对文件描述符执行
write()、close()操作的过程,不会主动触发DocumentsProvider更新缓存的元数据 - Android 11自带的「文件」应用优先读取DocumentsProvider缓存的元数据展示文件大小,不会实时读取文件实际内容统计大小,因此会显示0B
- 打开文件、生成缩略图的操作会直接读取文件实际内容,因此功能表现正常
修复方案
只需在原生层写入完成、关闭文件描述符之后,增加元数据同步操作即可,可选方案如下:
- 主动通知系统内容变更:调用
getContentResolver().notifyChange(fileUri, null),其中fileUri为创建文件时DocumentFile.getUri()的返回值,该操作会触发DocumentsProvider刷新对应文件的元数据缓存 - 主动更新文件元信息:调用
DocumentsContract.updateDocument()手动传入文件实际大小,更新系统记录的元数据 - 如果文件存储在公共媒体目录,可触发系统媒体扫描,将文件信息同步到MediaStore,同时会更新DocumentsProvider的缓存
内容的提问来源于stack exchange,提问作者Violet Giraffe
相关产品推荐
相关产品推荐

