利用Matisse实现相册图片选择

关于选择相册图片,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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值