知乎开源的图片选择器 Matisse 在 6.0 以上手机使用相机功能
来源:互联网 发布:网络教育优势 编辑:程序博客网 时间:2024/05/29 08:53
首发地址: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 的正确姿势
可以自己去写动态权限判断
使用开源库,目前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); }}
阅读全文
1 0
- 知乎开源的图片选择器 Matisse 在 6.0 以上手机使用相机功能
- Matisse Android图片选择器详细使用
- android Matisse图片选择器的引入
- Matisse Android 图片选择器
- 使用S60手机的相机对焦功能
- Matisse——Android 图片/视频选择器
- 知乎Matisse的使用
- 关于6.0手机的从相册或相机选择图片
- Android 调用系统相机进行拍照 使用自带的图片选择器和裁剪工具
- Android4.4以上的相册,相机图片选择和裁剪
- 调用手机相机功能
- webView在5.0以上手机加载网页不显示图片
- 如何解决H5中获取相机与图片,在苹果手机获取不了文件选择图片的问题
- 手机,相机防抖功能
- 【Android使用Shape绘制虚线,在4.0以上的手机显示实线】解决方案
- 魅族 Android 6.0 以上系统获取相机权限的坑
- 解决Android 6.0以上的相机权限适配问题
- 调用内置相机照片,部分手机图片旋转的解决方案
- 学习日记4
- Cocos2dx 复制文本到剪切板(Android 和 ios)
- 《Java 程序设计》——>数据类型与运算符
- Fire UVA
- C中数据的比较简介(strcmp、memcmp)
- 知乎开源的图片选择器 Matisse 在 6.0 以上手机使用相机功能
- ACM训练日记—8月3日
- mokeyrunner测试android
- Map 遍历 五种方法
- logstash 从数据库获取数据到将数据导入到es步骤
- idea maven 不能建java文件
- 剑指offer 34---丑数
- cocos开发环境配置
- 数据结构实验之栈三:后缀式求值