android 7.0系统拍照踩过的坑

Android7.0 对文件做了限制,不能直接分享file://开头的uri,必须转换成content://开头的。

1.在Manifest.xml文件中添加:

 

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.ateam.shippingcity.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>


2.在res目录下添加xml子目录,并新建file_paths文件,名字随便,只要和manifest中定义的一致就可以。添加如下内容

 

 

 

 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <!--<external-path path="" name="camera_photos" />-->
        <!--下载apk-->
        <external-path
            name="sdcard_files"
            path="" />
        <!--相机相册裁剪-->
        <external-files-path
            name="camera_has_sdcard"
            path="" />
        <files-path
            name="camera_no_sdcard"
            path="" />
    </paths>
</resources>

其中不同的标签代表不同的分享文件目录,包括app私有目录、外部存储目录、缓存目录等。 
path是你需要分享的相对子目录。 
name是别名,用来在Uri中替换具体的path

 

3.生成uri

 

private void dispatchTakePictureIntent() {
        Intent intent_photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent_photo.resolveActivity(getPackageManager()) != null) {
            FileUtil.getInstance().createSDDir(SAVED_IMAGE_DIR_PATH);
            String fileName = System.currentTimeMillis() + ".jpg";
            File file = FileUtil.getInstance().createFileInSDCard(SAVED_IMAGE_DIR_PATH, fileName);
            if (file != null) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    fileUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", file);//通过FileProvider创建一个content类型的Uri
                    intent_photo.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
                } else {
                    fileUri = Uri.fromFile(file);
                }
            }
            intent_photo.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
            startActivityForResult(intent_photo, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
        } else {
            MyToast.showShort(this, "无法启动相机");
        }
    }

4.最后拿到fileUri.getPath,进行预览、裁剪、上传等等操作;但是要注意一点,由于上面file_paths文件中有命名一个name,那么就要注意路径的问题了,不然是拿不到图片的。(比如现在拿到的路径是/storage/emulated/0/sdcard_files/xxxxxx.jpg,如果是这样的话你是拿不到图片的,必须把中间的sdcard_files这个name去掉才行


 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值