知乎开源的图片选择器 Matisse 在 6.0 以上手机使用相机功能

原创 2017年08月03日 21:08:16

首发地址:dongxi520.com
需求:实现一个图片选择器,能选择本地图片拍照

拿到需求,第一个想法就是看自己在规定时间上能否又快又好的实现。显然是不能( 。。),现在那么多前辈都把轮子都造好了,我们直接拼装不久可以了吗?目前为止,我还是这样,等功能深厚成为前辈了再撸几个轮子给后辈使用,这些都是后话,先实现这个需求吧。

先去GitHub搜索一圈图片选择器,发现知乎开源的Matisse家伙长的挺好看的,就选它了。使用步骤看GitHub的,官方的才是最正确的使用姿势。Matisse

或者是参看一下这位仁兄的介绍:Android 一起来看看知乎开源的图片选择库

官网的使用方式 默认是不开启拍照功能的,因此需要拍照功能的可以这么写

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 这个动态权限的控制下就有些问题了

6.0 以上使用 Matisse 的正确姿势

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);
   }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

知乎开源的图片选择库

项目地址: https://github.com/zhihu/Matisse点击打开链接  在开始正文之前,先欣赏一下这个图片选择器的效果 Matisse 是不是感觉相当的简洁好看,反正我是这...

<Android 开源库> Matisse,来自知乎的PhotoPicker

Matisse,来自知乎的PhotoPicker

Matisse Android图片选择器详细使用

Matisse Android 图片选择器 详细使用方式 ...

知乎Matisse的使用

知乎Matisse简介Matisse 是一款开源的图片选择,拍照库;可以使你的图片选择,拍照更加的优雅,调用方便等优点依赖compile 'com.zhihu.android:matisse:0.4....

知乎开源库Matisse接入使用问题

按照步骤,先导入了glide图片加载引擎,准备就绪准备看看效果的时候。抛出了: java.lang.NoSuchMethodError: No virtual method load(Landroi...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Matisse 与 Glide -- java.lang.NoSuchMethodError: com.bumptech.glide.RequestManager.load

原文地址(http://www.jianshu.com/p/220a7e5ce321) 问题描述 在使用 Matisse 与 glide 4.0.0 以及 4.0.0 之后的版本过程中,发现通过 ...

GestureDetector手势检测器的使用

GestureDetector类中定义了2个接口和一个空实现类,具体看源码: public class GestureDetector { /** * The listener th...
  • mChenys
  • mChenys
  • 2015年11月23日 13:07
  • 491

Android实现类似微信联系人中的分组列表

实现的原理就是解决两个问题: 1)数据主关键字按拼音间分组排序。 2)基于ExpandableListView控件实现内容展示。 (一)数据主关键字按拼音间分组排序 首先把主关键字...

知乎 图片选择器 Matisse demo

  • 2017年08月25日 13:47
  • 29.31MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:知乎开源的图片选择器 Matisse 在 6.0 以上手机使用相机功能
举报原因:
原因补充:

(最多只允许输入30个字)