Android 7.0私有目录权限

在做调用系统拍照的时候出现了问题,android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/xxxx.jpg exposed beyond app through ClipData.Item.getUri()
前几天还好好的为啥出现了问题呢,后来就想到了刚升级了手机系统。然后就搜索一大堆的解决方案。此次记录下,方便以后查询。

打开相机

private void openCamera() {
        if (!SDCardUtils.isSDCardEnable()) {
            Toast.makeText(this, "sDCard不可用!", Toast.LENGTH_SHORT).show();
        } else {
            try {
                String filePath = SDCardUtils.getSDCardPath();
                String imagePath = DialogUtils.getPhotoFileName();
                // 下面这句指定调用相机拍照后的照片存储的路径
                File dir = new File(filePath + "/dirName");
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                File tmpFile = new File(dir, imagePath);
                if (!tmpFile.exists()) {
                    tmpFile.createNewFile();
                }
                if (Build.VERSION.SDK_INT >= 24) {
                    imageUri = FileProvider.getUriForFile(this, "包名.fileprovider", tmpFile);//通过FileProvider创建一个content类型的Uri
                } else {
                    imageUri = Uri.fromFile(tmpFile);
                }
                Intent intent = new Intent();
                if (Build.VERSION.SDK_INT >= 24) {
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
                }
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
                startActivityForResult(intent, TAKE_PHOTO);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

以上可说的地方就是有一个配置的路径权限:
FileProvider.getUriForFile(this, "包名.fileprovider", tmpFile)这句是关键,其中‘包名’是自定义的,这里为了方便我是以项目的包名,切记。
需要在AndroidManifest.xml中配置:


        
            
        

file_paths:需要在资源目录下新建xml目录如图:

Android 7.0私有目录权限_第1张图片
file_paths.png


    

你可能感兴趣的:(Android 7.0私有目录权限)