您的当前位置:首页正文

适配安卓7.0拍照,图片选择,裁剪问题

来源:华拓网

本文章解决思路:使用FileProvider

使用FileProvider的大致步骤如下:
第一步:在manifest清单文件中注册provider

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.techfly.global_village.fileProvider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

其中com.xxx.xxx为包名
exported:要求必须为false,为true则会报安全异常。
grantUriPermissions:true,表示授予 URI 临时访问权限。

第二步:指定共享的目录

为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件,内容如下:

QQ截图20170926150432.png

第三步:使用FileProvider

//拍照
Intent cIntent = new Intent(Intent.ACTION_PICK, null);
cIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imageUri;
File file = new File(Environment.
getExternalStorageDirectory(), "/Download/upload.png");
if (!file.getParentFile().exists()) file.getParentFile().mkdirs();

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                imageUri = FileProvider.getUriForFile(context, "com.techfly.global_village.fileProvider", file);//通过FileProvider创建一个content类型的Uri
                ////添加这一句表示对目标应用临时授权该Uri所代表的文件
                cIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            } else {
                imageUri = Uri.fromFile(file);
            }

            cIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            startActivityForResult(cIntent, CAMERA_REQUEST_CODE);

添加了intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);来对目标应用临时授权该Uri所代表的文件

//图片选择的方法不做改动
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
// startActivityForResult(intent, GALLERY_REQUEST_CODE);

            startActivityForResult(intent, GALLERY_REQUEST_CODE);