解决安卓7.0拍照,相册选择崩溃的问题(包括压缩图片在内)

本文记录了在Android 7.0系统上拍照应用崩溃的问题,原因是API 24及以上版本不再支持file:// URI。解决步骤包括在AndroidManifest.xml中添加内提供者,创建file_paths.xml定义共享文件路径,以及在代码中适配content://URI,确保在不同版本的Android系统中正常工作。
摘要由CSDN通过智能技术生成

在今天,项目的功能开发的告一段落了,回顾之前遇到的难题,觉得有必要在博客中记录一下,也方便下次自己能快速解决问题,同时,也能给遇到同样问题的人一个参考。
这问题就是当用户使用android 7.0系统的手机进行拍照的时候,崩溃的问题。崩溃的原因,网上有很多详细的介绍,参考官方文档对该错误的解释,是由于出于安全考虑,Android 7.0[API24]以及以上版本不支持file://,类型的uri,而是使用content://URI。不然会报

android.os.FileUriExposedException这个错误提示

现在直接说明解决额步骤吧。
1.在清单文件AndroidManifest.xml中建一个内提供者

<!-- 适配android 7.0 拍照闪退的处理 ,其中authorities的值要和等下代码中使用的一致就行,其中resource内的文件就是拍照后的共享文件 -->
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.chc.photo.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

2.在res文件夹下面新建一个xml文件夹,然后在xml文件夹下面建立一个file_paths的xml文件作为provider的共享文件路径

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <paths>
        <external-path path="" name="camera_photos" />
        <files-path path="" name="photos" />
    </paths>
</resources>

其中name:一个引用字符串,意思就是可以随便写。
path:文件夹“相对路径”,完整路径取决于当前的标签类型。
path可以为空,表示指定目录下的所有文件、文件夹都可以被共享。
在这个文件中,为每个目录添加一个XML元素指定目录。paths 可以添加多个子路径:< files-path> 分享app内部的存储;< external-path> 分享外部的存储;< cache-path> 分享内部缓存目录。

< files-path >
代表目录为:Context.getFilesDir()

代表目录为:Environment.getExternalStorageDirectory()

代表目录为:getCacheDir()
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果对于path不理解的可以查询资料。

3.在代码中将原来的方法做判断,新增7.0的适配方法
拍照

 Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                //适配android7.0 手机拍照取uri的处理
                if(Build.VERSION.SDK_INT<24){
                    uri = Uri.fromFile(imgFile);//7.0这里会闪退,imgfile是图片文件路径

                    camera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                }else{
                    uri=FileProvider.getUriForFile(SellerAffiliate.this,"com.chc.photo.fileprovider",imgFile);
                    camera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                    camera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION );//添加这一句表示对目标应用临时授权该Uri所代表的文件
                }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值