Picasso加载本地文件不显示问题处理

最近在写项目中如何设计图片库,随便选择了Glide(4.8.0)和Picasso(2.71828)作为切换对象,然后在Picasso遇到了一些坑,记录以下:
简单说明以下:
Glide和Picasso在传入图片路径的时候,大致都支持以下格式:

  • 网络地址:如http://xxxxx.xxx.xxx/xxx.png
  • 本地文件:/sdcard/image/xxx.png
  • 本地文件的uri格式:file:////sdcard/image/xxx.png
  • File类型:new File("/sdcard/image/xxx.png")
  • 其他格式,如uri、byte数组等等

以上格式传入的时候在不同的手机版本中Glide都可以显示出图片来,但是在Picasso,我自己测试的
/sdcard/image/xxx.png
file:////sdcard/image/xxx.png
new File("/sdcard/image/xxx.png")
Uri.parse("file:////sdcard/image/xxx.png")
Uri.fromFile(file)
这几种格式在华为meta10 pro手机上都无法显示,只有网络地址的可以显示。
这个问题研究了半天,各种网上查资料,大部分都说的是直接传入/sdcard/image/xxx.png这种格式不能显示,这个原因我是知道的,没有说明为什么传入file类型或者添加了file:////sdcard/image/xxx.png格式的也无法显示,突然想到之前做相册图片裁剪时遇到的7.0以上uri安全问题,测试了一下果然如此。解决方案如下:

public void showImage(Context context, ImageView imageView, String url) {
    Uri loadUri = null;
    if (url.startsWith("http")) {
        //网络图片
        loadUri = Uri.parse(url);
    } else {
        //本地文件
        if (url.startsWith("file://")) {
            //文件的方式
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
                //Android 7.0系统开始 使用本地真实的Uri路径不安全,使用FileProvider封装共享Uri
                url = Uri.parse(url).getPath();
            }
        }
        File file = new File(url);
        if (file != null && file.exists()) {
            //本地文件
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
                //Android 7.0系统开始 使用本地真实的Uri路径不安全,使用FileProvider封装共享Uri
                loadUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
            } else {
                loadUri = Uri.fromFile(file);
            }
        } else {
            //可能是资源路径的地址
            loadUri = Uri.parse(url);
        }
    }
    Picasso.get().load(loadUri).into(imageView);
}

虽然Picasso也挺好的,但是两个用起来以及在兼容性、实用性上面,自我感觉还是Glide使用者顺手。(性能方面不做比较)

你可能感兴趣的:(Picasso加载本地文件不显示问题处理)