第三方库 图片选择MultiImageSelector兼容Android 7.0+

项目接手的时候就用了MultiImageSelector的jar包,可是到后面发现要在上面新增一些需求,比如加水印呀什么的,而且因为现在Android系统版本越来越高了,当我想统一第三方库和项目的build.gradle的编译版本时,发现拍照和录制视频出问题了,于是我把这个第三方库拷贝了下来,并且开始Android 7.0+的兼容。

1、在res目录下新建一个名为“xml"的文件夹,然后在里面新建一个名字为”file_paths“的文件,里面的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path
            name="external_storage_root"
            path="" />
        <!--name属性自行定义,只是个名称而已
            path属性的值表示共享的具体位置,设置为空时表示共享整个SD卡,也可以指定对应的SD卡下的文件目录,根据需求自行定义-->
    </paths>
</resources>

2、在清单文件中注册一个provider,authorities是我们在代码中要用到的内容,所以我把它写在string文件里面,这样可以防止我们万一复制粘贴没弄好,半天找不到原因,内容是我们app的包名 + ”.名称“,这个名称也可以是其他的命名,没有固定要求。


3、做完上面这两步,就要开始改代码了,找到MultiImageSelectorActivity类中的onCameraShot方法,里面会有如下一句代码:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(imageFile));

而问题就出在了Uri.fromFile这里,我们只需要在这儿加上一个判断,兼容的代码如下:

Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
    uri = FileProvider.getUriForFile(this, getString(R.string.mis_file_provider), imageFile);
else
    uri = Uri.fromFile(imageFile);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));

同样地,在MultiImageSelectorFragment的showCameraAction()方法中也是这么处理,找到下面一句代码:

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));

然后把它改成如下代码:

Uri uri = Uri.fromFile(mTmpFile);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
    uri = FileProvider.getUriForFile(this.getContext(), getString(R.string.mis_file_provider), mTmpFile);//通过FileProvider创建一个content类型的Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

打开系统视频也是一样的,直接贴代码:

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
Uri uri = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? FileProvider.getUriForFile(this.mActivity, mContext.getString(R.string.mis_file_provider), new File(mSelectedAviFile))
                : Uri.fromFile(new File(mSelectedAviFile));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO);

好了,全部搞定,有问题欢迎评论区留言。

猜你喜欢

转载自blog.csdn.net/shan286/article/details/80521985