1.可用的參考文章:
非常簡(jiǎn)潔的介紹:http://www.itdecent.cn/p/41e09238d61b
詳細(xì)但代碼不可用的(過時(shí)):http://www.itdecent.cn/p/382346bf0aa9
2.需求
- 我的需求是非常簡(jiǎn)單,就是要把圖片選擇然后返回圖片的真實(shí)路徑。
- 需求1:選擇多圖
- 需求2:返回Uri
- 需求3:獲取圖片真實(shí)路徑
3.第三方庫(kù) Matisse
相識(shí)的圖片選擇庫(kù)有很多,比如:PhotoPicker。至于我選擇Matisse的原因是之前學(xué)習(xí)中就有使用過這個(gè)庫(kù),用起來有快捷。
4.使用步驟
- 1.導(dǎo)入相應(yīng)的依賴庫(kù)。
- 2.權(quán)限申請(qǐng)(臨時(shí)動(dòng)態(tài)權(quán)限)。
- 3.啟動(dòng)Matisse。
- 4.重寫GlideEngine類,在Matisse中引用。
- 5.接收選擇的結(jié)果onActivityResult。
- 6.返回的Uri轉(zhuǎn)換成真實(shí)路徑。
5.遇到的問題
- 問題1:Matisse的圖片加載器GlideEngine需要重寫。
- 問題2:Fragment的onActivityResult方法不會(huì)調(diào)用,需要在Activity中重寫。
問題1:Matisse的圖片加載器有兩種:Glide和Picasso,發(fā)現(xiàn)GlideEngine類的寫法還停留在3.7版本之前,這時(shí)我就打開了Matisse的Github上的問題庫(kù)和案例。

GlideEngine錯(cuò)誤
- 問題1解決辦法:就是手動(dòng)寫一個(gè)GlideEngine類,并在Matisse啟動(dòng)方法中去調(diào)用這個(gè)類。

調(diào)用另一個(gè)GlideEngine

新版Glide的寫法
問題2:原本的是在Fragment中去啟動(dòng)Matisse進(jìn)行圖片選擇,但是在返回onActivityResult中的代碼遲遲未調(diào)用,導(dǎo)致我頭昏腦脹。
- 問題2解決方法:在Fragment所在的Activity中重寫onActivityResult()方法并接收返回的圖片Uri,最后把數(shù)據(jù)傳遞給Fragment(這里就考到Activity與Fragment之間的通信問題)。
6.代碼
1.導(dǎo)入相應(yīng)的依賴庫(kù)
//圖片選擇庫(kù)
implementation 'com.zhihu.android:matisse:0.5.2-beta4'
//圖片加載
implementation 'com.github.bumptech.glide:glide:4.9.0'
2.權(quán)限申請(qǐng)(臨時(shí)動(dòng)態(tài)權(quán)限)
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
權(quán)限申請(qǐng)的工具類可以參考這個(gè)文章:http://www.itdecent.cn/p/5e566e05dd96
3.啟動(dòng)Matisse
/**
* 知乎開源圖片選擇器
*/
private void ChooserImg() {
Matisse.from(getActivity())
.choose(MimeType.ofAll(), false)
.countable(true)
.maxSelectable(9) // 圖片選擇的最多數(shù)量
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
.thumbnailScale(0.85f) // 縮略圖的比例
.imageEngine(new GlideImageEngine()) // 使用的圖片加載引擎
.forResult(REQUEST_CODE_CHOOSE); // 設(shè)置作為標(biāo)記的請(qǐng)求碼
}
還要在dimens.xml中添加以下代碼:
<dimen name="grid_expected_size">120dp</dimen>
<dimen name="item_margin_horizontal">24dp</dimen>
<dimen name="item_margin_vertical">8dp</dimen>
為了你們的方便,我把標(biāo)識(shí)碼代碼也貼出來
// 圖庫(kù)選取圖片標(biāo)識(shí)請(qǐng)求碼
private static final int REQUEST_CODE_CHOOSE = 0x13;
- 4.重寫GlideEngine類,在Matisse中引用。
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.zhihu.matisse.engine.ImageEngine;
/**
* Created by songsong on 2019/5/4 0004
*/
public class GlideImageEngine implements ImageEngine {
@Override
public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
Glide.with(context)
.asBitmap() // some .jpeg files are actually gif
.load(uri)
.placeholder(placeholder)
.override(resize, resize)
.centerCrop()
.into(imageView);
}
@Override
public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
Glide.with(context)
.asBitmap()
.load(uri)
.placeholder(placeholder)
.override(resize, resize)
.centerCrop()
.into(imageView);
}
@Override
public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
Glide.with(context)
.load(uri)
.override(resizeX, resizeY)
.priority(Priority.HIGH)
.fitCenter()
.into(imageView);
}
@Override
public void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
Glide.with(context)
.asGif()
.load(uri)
.override(resizeX, resizeY)
.priority(Priority.HIGH)
.into(imageView);
}
@Override
public boolean supportAnimatedGif() {
return true;
}
}
5.接收選擇的結(jié)果onActivityResult,返回的Uri轉(zhuǎn)換成真實(shí)路徑。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {// 操作成功了
switch (requestCode) {
case REQUEST_CODE_CHOOSE:// 圖庫(kù)選擇圖片
List<Uri> imglisturi = Matisse.obtainResult(data);
List<String> imgliststr = new ArrayList<>();
for (Uri uri : imglisturi) {
imgliststr.add(ImageUriUtil.getPhotoPathFromContentUri(this, uri));
}
LogUtil.Logd("onActivityResult拿到了" + imgliststr.size() + "張圖片:" + imgliststr);
break;
}
}
}
End