美文网首页
Android 7.0私有目录权限

Android 7.0私有目录权限

作者: 灿烂的黑土 | 来源:发表于2017-03-29 15:56 被阅读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>
    

    相关文章

      网友评论

          本文标题:Android 7.0私有目录权限

          本文链接:https://www.haomeiwen.com/subject/taieottx.html