开发者社区> 问答> 正文

Android 7.0设备拍照闪退问题 -安卓报错

拍照闪退问题

展开
收起
montos 2020-05-29 19:53:26 747 0
1 条回答
写回答
取消 提交回答
  • 原因: Android 7.0 做了一些系统权限更改,为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问,此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。而此权限更改有多重副作用,其中之一就是当传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。在应用间共享文件对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。要在应用间共享文件,应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。点击查看Android官方说明

    解决方案 1.在清单文件添加如下代码

        <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/provider_paths"/>
    
           </provider>
    
    android:authorities="com.alex.demo.FileProvider" 自定义的权限  
    
    android:exported="false" 是否设置为独立进程  
    
    android:grantUriPermissions="true" 是否拥有共享文件的临时权限  
    
    android:resource="@xml/external_storage_root" 共享文件的文件根目录,名字可以自定义  
    

    2.在xml文件夹目录下新建provider_paths文件,名字自定义,添加如下代码

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
       <paths>
           <external-path
               name="camera_photos"
               path="" />
       </paths>
    </resources>
    

    3.调用系统相机处代码处理

      //调用系统相机拍照
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, parUri(tempFile));
     startActivityForResult(cameraIntent, REQUEST_CAMERA);
    }
    
      /**
        * 生成uri
        *
        * @param cameraFile
        * @return
        */
       private Uri parUri(File cameraFile) {
           Uri imageUri;
           String authority = getContext().getPackageName()+ ".provider";
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
               //通过FileProvider创建一个content类型的Uri
               imageUri = FileProvider.getUriForFile(getContext(), authority, cameraFile);
           } else {
               imageUri = Uri.fromFile(cameraFile);
           }
           return imageUri;
       }
    
    
    2020-05-29 19:53:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载