Android 7.0拍照出现android.os.FileUriExposedException异常

最近上线的一个app在客户那里反馈调用手机系统拍照时崩溃的问题,说使用的是Android 7.0系统,后来费劲找来一个Android 7.0的手机调试了一下,发现不能再用以前的方式来调用:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(pictureFile));
            mCurrentFragment.startActivityForResult(intent, REQUEST_CODE_FORM_CAMERA);

这时会抛出异常:

FATAL EXCEPTION: main
Process: com.test.android.debug, PID: 19189
android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.test.android.debug/files/Pictures/bs20170419092740.jpg exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1816)
at android.net.Uri.checkFileUriExposed(Uri.java:2350)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)

这个异常只会在Android 7.0以及以上版本才会出现,是说通过此方式会出现暴露文件Uri的异常,这个Uri可以通过ClipData.Item.getUri() 方法获取到。后来查了一下需要使用以下方式:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            doTakePhotoIn7(pictureFile.getAbsolutePath());
        } else {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(pictureFile));
            mCurrentFragment.startActivityForResult(intent, REQUEST_CODE_FORM_CAMERA);
        }
//在Android7.0以上拍照
    private void doTakePhotoIn7(String path) {
        Uri mCameraTempUri;
        try {
            ContentValues values = new ContentValues(1);
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
            values.put(MediaStore.Images.Media.DATA, path);
            mCameraTempUri = mCurrentFragment.getActivity().getContentResolver()
                    .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            takePhoto(mCurrentFragment, REQUEST_CODE_FORM_CAMERA, mCameraTempUri);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void takePhoto(Fragment fragment, int requestCode, Uri uri) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        if (uri != null) {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        }
        fragment.startActivityForResult(intent, requestCode);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值