本文章解决思路:使用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);