关于android 7.0调用相机拍照崩溃问题

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

因为项目需要调用相机拍照,自己的测试手机是5.0,按照正常的调用方法直接可以调用,在项目测试的时候,同事的7.0系统相机拍照就崩了,进入相册没有崩,以前就听过7.0的权限问题,今天刚好碰到了就自己试着去解决一下这个问题。顺便记录一下,同时要感谢我所转载的那篇文章的大神

1.在清单文件AndroidManifest.xml中建一个内容提供者(不用java代码创建,直接复制到清单文件下即可)

<!-- 适配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的适配方法 
拍照

private void tackUploadingCamera() {
        //创建File对象,用于存储选择的照片
        File outputImage = new File(getDiskCacheDir(mContext), "test.jpg");
        Log.i(tag, "拍照文件路径=============:" + outputImage.toString());
        try {
            if (outputImage.exists()) {
                outputImage.delete();
            }
            outputImage.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        Log.i(tag, "拍照的照片:imageUri路径:" + imageUri);
        //隐式意图启动相机,拍照后并把照片存储的url存储到intent中区
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        //判断是否是7.0的系统
        if (Build.VERSION.SDK_INT < 24) {
            //拍照的照片路径
            imageUri = Uri.fromFile(outputImage);//7.0这里会闪退,imgfile是图片文件路径
            Log.i(tag, "7.0之前的系统,拍照的照片:imageUri路径:" + imageUri);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        } else {
            //7.0系统的操作
            imageUri = FileProvider.getUriForFile(mContext, "com.chc.photo.fileprovider", outputImage);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
            Log.i(tag,"android7.0动态添加权限");
        }
        // 启动相机程序的Activity,Cut_PHOTO 是我项目需要进行裁剪功能,拍完后进行裁剪,这个可以根据自己需求去自己设置
        startActivityForResult(intent, Cut_PHOTO);
    }

注意:不要添加这个权限,我之前有这个权限的时候一直崩掉,删除就好了

<uses-permission android:name="android.permission.CAMERA" />-->

到这就解决了,拍照崩溃问题,暂时先这样吧,项目要赶进度,等有时间在研究








  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值