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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:16:50