最近在写项目中如何设计图片库,随便选择了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使用者顺手。(性能方面不做比较)
网友评论