最近在寫項(xiàng)目中如何設(shè)計(jì)圖片庫览效,隨便選擇了Glide(4.8.0)和Picasso(2.71828)作為切換對象游岳,然后在Picasso遇到了一些坑杠娱,記錄以下:
簡單說明以下:
Glide和Picasso在傳入圖片路徑的時(shí)候乏奥,大致都支持以下格式:
- 網(wǎng)絡(luò)地址:如
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
數(shù)組等等
以上格式傳入的時(shí)候在不同的手機(jī)版本中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手機(jī)上都無法顯示,只有網(wǎng)絡(luò)地址的可以顯示邪铲。
這個(gè)問題研究了半天芬位,各種網(wǎng)上查資料,大部分都說的是直接傳入/sdcard/image/xxx.png
這種格式不能顯示带到,這個(gè)原因我是知道的昧碉,沒有說明為什么傳入file類型或者添加了file:////sdcard/image/xxx.png
格式的也無法顯示,突然想到之前做相冊圖片裁剪時(shí)遇到的7.0以上uri安全問題揽惹,測試了一下果然如此被饿。解決方案如下:
public void showImage(Context context, ImageView imageView, String url) {
Uri loadUri = null;
if (url.startsWith("http")) {
//網(wǎng)絡(luò)圖片
loadUri = Uri.parse(url);
} else {
//本地文件
if (url.startsWith("file://")) {
//文件的方式
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
//Android 7.0系統(tǒng)開始 使用本地真實(shí)的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系統(tǒng)開始 使用本地真實(shí)的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也挺好的,但是兩個(gè)用起來以及在兼容性搪搏、實(shí)用性上面狭握,自我感覺還是Glide使用者順手。(性能方面不做比較)