Android 7.0私有目录权限

2017-03-29  本文已影响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中配置:

<!-- 适配安卓7.0拍照 -->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="包名.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

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

file_paths.png
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="" name="camera_photos" />
</paths>
上一篇 下一篇

猜你喜欢

热点阅读