使用Glide无法加载本地文件路径图片至ImageView的问题求助
问题根因
- Android 10(API 29)开始默认启用分区存储机制,应用无法直接通过绝对路径访问公共存储目录下的媒体文件,哪怕文件真实存在、你申请了存储权限也会被系统拦截,这是加载失败的核心原因。
- 你用到的从
_data字段取路径的写法本身就不属于安卓公开API,谷歌官方明确不推荐使用,不同系统版本、不同厂商的返回结果不稳定,高版本系统中大概率返回无效路径。
解决方案
方案1:改用Uri存储(推荐,适配全版本系统)
不要把Uri转成绝对路径存储,直接存Uri字符串,同时申请持久化访问权限即可:
- 存路径的逻辑修改:
@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(); } }
- 加载图片的逻辑修改:
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(); } });
- 权限适配:
- 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
相关产品推荐
相关产品推荐

