关于选择相册图片,Android有原生的支持。但是不能多选。市面上关于图片选择的框架很多。但是可能是本人水平有限,测试过很多个。各有各的缺陷。目前Matisse是比较好用的。
不废话。直接上效果图:
这个框架的UI封装的有蓝色和灰色两种。可以自由选择。
来说一说用法
1、首先,引入框架依赖:
implementation 'com.zhihu.android:matisse:0.5.3-beta3'
版本我这里用的是最新的:0.5.3-beta3。后续版本更新的话。可以在GitHub中查看。
在Matisse使用的时候。还有因为兼容到Glide 4.x的一些问题。所以需要自己实现 ImageEngine 超类。(我这边用的glide:3.7.0),但是也实现了。
定义MyGlideEngine类,如下:
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;
public class MyGlideEngine implements ImageEngine {
@Override
public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
Glide.with(context)
.load(uri)
.override(resize, resize)
.centerCrop()
.into(imageView);
}
@Override
public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
Glide.with(context)
.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)
.into(imageView);
}
@Override
public void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
}
@Override
public boolean supportAnimatedGif() {
return true;
}
}
还需要在res目录下,新建xml文件夹。并新建xml:photo_path.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="my_images"
path="Pictures" />
</paths>
后在 AndroidManifest.xml 中注册provider:
<application
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="PhotoPicker"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/photo_path" />
</provider>
>
并且添加如下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
到此准备工作就完成了。下面说使用:
在Activity中需要的地方添加如下代码:
Matisse
.from(mActivity)
//选择视频和图片
.choose(MimeType.ofAll())
//选择图片
.choose(MimeType.ofImage())
//选择视频
.choose(MimeType.ofVideo())
//自定义选择选择的类型
.choose(MimeType.of(MimeType.JPEG,MimeType.AVI))
//是否只显示选择的类型的缩略图,就不会把所有图片视频都放在一起,而是需要什么展示什么
.showSingleMediaType(true)
//这两行要连用 是否在选择图片中展示照相 和适配安卓7.0 FileProvider
.capture(true)
.captureStrategy(new CaptureStrategy(true,"PhotoPicker"))
//有序选择图片 123456...
.countable(true)
//最大选择数量为9
.maxSelectable(9)
//选择方向
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
//界面中缩略图的质量
.thumbnailScale(0.8f)
//蓝色主题
.theme(R.style.Matisse_Zhihu)
//黑色主题
.theme(R.style.Matisse_Dracula)
//Glide加载方式
.imageEngine(new GlideEngine())
//Picasso加载方式
.imageEngine(new PicassoEngine())
//请求码
.forResult(REQUEST_CODE_CHOOSE);//请求码自定义数字
然后,实现onActivityResult,来接收选择后返回的图片内容:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == case REQUEST_CODE_CHOOSE_PHOTO_ALBUM: && resultCode == RESULT_OK) {
//图片路径 同样视频地址也是这个 根据requestCode
List<String> pathList = Matisse.obtainResult(data);
}
}
到此就是全部流程。
此框架不带权限申请。动态权限申请请自行添加。此处不做赘述。
END