Android Studio Kotlin实现相册选图上传时FilePath返回null问题
问题根因
- 参考的旧版本Java实现仅适配Android 7.0之前的无限制开放存储模型,在当前主流Android版本(尤其是Android 10之后引入分区存储机制)上完全失效:系统不再允许应用直接访问设备上的真实物理文件路径,即便是通过
MediaStore查询返回的结果,也不会暴露可直接读取的本地文件绝对路径,你从cursor中取出的所谓filePath本质是无效字符串,并非真实可访问的文件地址 BitmapFactory.decodeFile()仅能读取应用拥有直接文件系统权限的本地物理路径,对跨应用授权的content://类型URI完全不支持——从相册选择后返回的图片结果就是经过权限封装的content://访问句柄,本身没有对应可直接读取的物理路径,传入无效路径解码自然始终返回null- 原有
getPath()实现缺少必要的异常防护:未对cursor做空值判断、操作完成后未及时关闭cursor,在高版本系统下一旦查询返回空结果,直接取列值就会得到null值,进一步触发解码失败
有效方案的实现逻辑
你验证通过的代码写法是适配当前Android权限模型的标准实践:
- 系统在用户完成相册选图并返回结果时,已经自动给当前应用授予了对应
content://URI的临时读权限,不需要额外申请全局存储权限 - 跳过无意义的URI转物理路径环节,直接通过
contentResolver.openInputStream()拿到对应图片的输入流,再通过BitmapFactory.decodeStream()生成位图,可兼容全版本Android的存储规则,不会出现路径获取失败、解码为空的问题
注意:该实现需及时关闭IO流避免内存泄漏;加载大尺寸图片时需额外做采样率压缩,防止触发OOM
内容的提问来源于stack exchange,提问作者Udo-N
相关产品推荐
相关产品推荐

