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

使用Glide无法加载本地文件路径图片至ImageView的问题求助

问题根因

  1. Android 10(API 29)开始默认启用分区存储机制,应用无法直接通过绝对路径访问公共存储目录下的媒体文件,哪怕文件真实存在、你申请了存储权限也会被系统拦截,这是加载失败的核心原因。
  2. 你用到的从_data字段取路径的写法本身就不属于安卓公开API,谷歌官方明确不推荐使用,不同系统版本、不同厂商的返回结果不稳定,高版本系统中大概率返回无效路径。

解决方案

方案1:改用Uri存储(推荐,适配全版本系统)

不要把Uri转成绝对路径存储,直接存Uri字符串,同时申请持久化访问权限即可:

  1. 存路径的逻辑修改:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) {
        imageUri = data.getData();
        // 申请Uri持久化读取权限,避免重启应用后无法访问
        int takeFlags = data.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION;
        getContentResolver().takePersistableUriPermission(imageUri, takeFlags);
        img.setImageURI(imageUri);
        // 直接存Uri字符串,不需要转路径
        imgS = imageUri.toString();
    }
}
  1. 加载图片的逻辑修改:
Uri imgUri = Uri.parse(item.getImg());
Glide.with(c).load(imgUri).into(holder.img);
holder.img.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(c, imgUri.toString(), Toast.LENGTH_SHORT).show();
    }
});
  1. 权限适配:
  • Android 6.0~12.0(API 23~32):动态申请READ_EXTERNAL_STORAGE权限
  • Android 13及以上(API 33+):动态申请READ_MEDIA_IMAGES权限

方案2:临时兼容方案(仅适合Android 12及以下设备救急)

如果不想改动现有存储逻辑,可以在AndroidManifest.xml的<application>节点添加属性android:requestLegacyExternalStorage="true",这个属性可以在Android 10~12的设备上停用分区存储,恢复旧版的文件访问逻辑,但Android 13及以上系统该属性会失效,不建议长期使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 20:54:03