2018-7-23 更新
Matisse使用文档
Matisse 中使用 Filter 过滤图片大小等操做
Filter 过滤器,Matisse 中这样描述:Filter for choosing a {@link Item}. You can add multiple Filters through 也就是在你选择图片的时候过滤掉你不想选择的内容。java
例如:网上常见的过滤gif
功能,还有我这里说明的过滤图片大小
功能.
首先建立一个子类,继承 Matisse
中使用 Filter
android
public class MiniSizeFilter extends Filter {
private int mMinWidth;
private int mMinHeight;
private int mMaxSize;
public MiniSizeFilter(int minWidth, int minHeight, int maxSizeInBytes) {
mMinWidth = minWidth;
mMinHeight = minHeight;
mMaxSize = maxSizeInBytes;
}
/** * 约束的图片类型 * @return */
@Override
protected Set<MimeType> constraintTypes() {
return EnumSet.of(MimeType.JPEG, MimeType.PNG, MimeType.BMP, MimeType.WEBP);
}
@Override
public IncapableCause filter(Context context, Item item) {
if (!needFiltering(context, item)){
return null;
}
Point size = PhotoMetadataUtils.getBitmapBound(context.getContentResolver(), item.getContentUri());
// Log.e(TAG, "filter: mimeType--------->"+item.mimeType);
// Log.e(TAG, "filter: describeContents--------->"+item.describeContents());
// Log.e(TAG, "filter: duration--------->"+item.duration);
// Log.e(TAG, "filter: getContentUri--------->"+item.getContentUri());
// Log.e(TAG, "filter: id--------->"+item.id);
// 图片的大小
// Log.e(TAG, "filter: size--------->"+item.size);
// Log.e(TAG, "filter: uri--------->"+item.uri);
// 图片的宽高
// Log.e(TAG, "filter: size.x--------->"+size.x );
// Log.e(TAG, "filter: size.y--------->"+size.y );
if (size.x < mMinWidth || size.y < mMinHeight || item.size > mMaxSize) {
// IncapableCause.TOAST 表示 Toast 提示,它有三个选择:{TOAST, DIALOG, NONE}
return new IncapableCause(IncapableCause.TOAST, context.getString(R.string.image_size_to_small, mMinWidth,
String.valueOf(PhotoMetadataUtils.getSizeInMB(mMaxSize))));
}
return null;
}
}
使用方式以下:git
Matisse.from(MainActivity.this)
...
.addFilter(new MiniSizeFilter(320, 320, 5 * Filter.K * Filter.K)) // 控制宽高为320*320 以上,大小为 50M 如下
.forResult(REQUEST_CODE_CHOOSE);
以上为2018-7-23更新github
首发地址:dongxi520.com
需求:实现一个图片选择器,能选择本地图片和拍照web
拿到需求,第一个想法就是看本身在规定时间上可否又快又好的实现。显然是不能( 。。),如今那么多前辈都把轮子都造好了,咱们直接拼装不久能够了吗?目前为止,我仍是这样,等功能深厚成为前辈了再撸几个轮子给后辈使用,这些都是后话,先实现这个需求吧。app
先去GitHub搜索一圈图片选择器,发现知乎开源的Matisse家伙长的挺好看的,就选它了。使用步骤看GitHub的,官方的才是最正确的使用姿式。Matisse ide
或者是参看一下这位仁兄的介绍:Android 一块儿来看看知乎开源的图片选择库svg
官网的使用方式 默认是不开启拍照功能的,所以须要拍照功能的能够这么写ui
Matisse.from(PublishActivity.this)
.choose(MimeType.allOf()) // 选择 mime 的类型
.countable(true) // 显示选择的数量
.capture(true) // 开启相机,和 captureStrategy 一并使用不然报错
.captureStrategy(new CaptureStrategy(true,"com.meiqu.pianxin.ui.publish.MyFileProvider")) // 拍照的图片路径
.theme(R.style.Matisse_Dracula) // 黑色背景
.maxSelectable(9) // 图片选择的最多数量
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size)) // 列表中显示的图片大小
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
.thumbnailScale(0.85f) // 缩略图的比例
.imageEngine(new GlideEngine()) // 使用的图片加载引擎
.forResult(REQUEST_CODE_CHOOSE); // 设置做为标记的请求码,返回图片时使用
captureStrategy(new CaptureStrategy(true,"com.meiqu.pianxin.ui.publish.MyFileProvider"))
主要是告知系统拍照的图片存储位置- 第二个参数是本身实现继承FileProvider类的一个空类,须要在manifest文件中添加以下代码
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.meiqu.pianxin.ui.publish.MyFileProvider" android:exported="false" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths"/>
</provider>
- android:resource=”@xml/filepaths” 是在res/xml 目录下的建立的文件filepaths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--表明外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/DCIM/camerademo目录-->
<external-path name="mq_DCIM" path="DCIM/camerademo" />
<!--表明外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/Pictures/camerademo目录-->
<external-path name="mq_Pictures" path="Pictures/camerademo" />
<!--表明app 私有的存储区域 Context.getFilesDir()目录下的images目录 /data/user/0/com.hm.camerademo/files/images-->
<files-path name="mq_private_files" path="images" />
<!--表明app 私有的存储区域 Context.getCacheDir()目录下的images目录 /data/user/0/com.hm.camerademo/cache/images-->
<cache-path name="mq_private_cache" path="images" />
<!--表明app 外部存储区域根目录下的文件 Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)目录下的Pictures目录-->
<external-files-path name="mq_external_files" path="Pictures" />
<!--表明app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的images目录-->
<external-cache-path name="mq_external_cache" path="" />
<root-path name="mq_external_cache" path="" />
</paths>
以上使用在 5.0 如下的手机是没毛病的,在 6.0 这个动态权限的控制下就有些问题了this
6.0 以上使用 Matisse 的正确姿式
能够本身去写动态权限判断
使用开源库,目前start 最多的动态权限库是 PermissionsDispatcher start已经5000+而且最近15天还在维护
Matisse 和 PermissionsDispatcher 的使用姿式
Matisse 须要用到相机和读写本地数据的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.Manifest.permission.READ_PHONE_STATE" />
因此在调用了这些权限的地方是使用 PermissionsDispatcher 去动态设置,看PermissionsDispatcher 官网介绍
我在实际中使用
步骤:
- 在Activity或者Fragment上添加 @RuntimePermissions
- 在用到权限的方法( 例如:void initData(),不能加上 private 修饰)名上添加@NeedsPermission(Manifest.permission.READ_PHONE_STATE)
- 重写onRequestPermissionsResult方法,MainActivityPermissionsDispatcher.onRequestPermissionsResult(MainActivity.this, requestCode, grantResults);
- 在onCreate方法调用MainActivityPermissionsDispatcher.initDataWithCheck(MainActivity.this);
实例:
@RuntimePermissions // 必须添加
public class MainActivity extends AppCompatActivity {
...
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
....
MainActivityPermissionsDispatcher.initDataWithCheck(MainActivity.this);
....
}
@NeedsPermission(Manifest.permission.READ_PHONE_STATE) // 必须添加
void initData() { // 会调用用户信息权限
DataCenter dc = DataCenter.getInstance();
dc.initDataCenter(this);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult(MainActivity.this, requestCode, grantResults);
}
}
本文同步分享在 博客“_龙衣”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。