使用Picasso加载Image Uri时ImageView未填充问题求助
解决Picasso加载content://媒体URI填充ImageView失败的问题
我之前也踩过类似的坑,结合你的权限配置和URI类型,咱们一步步拆解解决:
1. 先修正无效的权限配置
你添加的MANAGE_DOCUMENTS权限是系统保护级权限,普通Android应用根本拿不到实际的访问权限,这个权限可以直接删掉,完全起不到作用。
根据你的Android版本,替换成正确的媒体访问权限:
- Android 13及以上:只需添加
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> - Android 12及以下:添加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />(注意:Android 6.0及以上还需要动态申请这个危险权限,只在Manifest声明没用)
另外,如果你只是加载图片而非写入文件,WRITE_EXTERNAL_STORAGE权限也可以去掉。
2. 确认URI的访问有效性
你拿到的content://com.android.providers.media.documents...这类URI,一般是从系统文件选择器获取的。如果是通过ACTION_OPEN_DOCUMENT或ACTION_GET_CONTENT启动的选择器,系统会自动给APP临时访问该URI的权限,这时候Picasso可以直接加载。
但如果是手动构建的URI,或者权限过期,就会加载失败。这时候可以通过ContentResolver获取图片输入流,绕开权限限制交给Picasso处理。
3. 正确的Picasso加载代码示例
方式一:直接加载URI(推荐,前提是URI有有效访问权限)
Picasso.get() .load(yourContentUri) .placeholder(R.drawable.loading_placeholder) // 可选:设置加载中占位图 .error(R.drawable.load_error) // 可选:设置加载失败图 .into(yourImageView);
方式二:通过输入流加载(解决权限/URI兼容性问题)
如果直接加载不行,试试用ContentResolver打开输入流:
try { InputStream imageStream = getContentResolver().openInputStream(yourContentUri); Picasso.get() .load(imageStream) .into(yourImageView); } catch (IOException e) { Log.e("PicassoLoadError", "图片加载失败", e); // 这里可以添加加载失败的UI提示逻辑 }
4. 额外注意事项
- 确保你用的是最新版Picasso,旧版本可能对部分content URI的支持有bug;
- 别尝试用
file://URI替代content URI,Android 7.0以上会触发FileUriExposedException,完全不允许这么做; - 如果是Android 10及以上,不要用
Environment.getExternalStorageDirectory()这类方法直接访问文件,优先用content URI或MediaStore API。
内容的提问来源于stack exchange,提问作者android_monstertjie
相关产品推荐
相关产品推荐

