Android 7.0手机打开相机或相册报错解决方案

 
 

原文地址:http://www.jianshu.com/p/edec55192944

在android 7.0以上的手机上打开相机、相册会报如下错误: android.os.FileUriExposedException: ** exposed beyond app through Intent.getData()

产生原因: 在Android7.0系统上,Android 框架强制执行了 StrictMode API 政策禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常,如调用系统相机拍照,或裁切照片。

解决方法: 官方的解决方法(https://developer.android.google.cn/training/secure-file-sharing/setup-sharing.html)

1、在manifest清单文件中注册provider

<!--android7.0拍照 需要注册FileProvider-->
<provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="包名.fileprovider"
      android:grantUriPermissions="true"
      android:exported="false">
      <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
 </provider>

也就是在application内加了一个provider,其中,name是固定的,android:authorities是你的应用报名+“.fileprovider”,其实这里不一定要写fileprovider,可以随便写,只是要与后面FileProvider.getUriForFile()这个方法中的第二个参数authority对应起来即可。android:grantUriPermissions固定true,表示uri访问授权,android:exported固定的false,android:resource表示我们app要共享文件的路径的资源文件.

2、指定共享目录

在res下新建xml文件夹,新建file_paths.xml文件

<paths>
    <external-path name="external_files" path="."/>
</paths>

为了指定共享的目录我们需要在资源(res)目录下创建一个xml目录,然后创建一个名为“file_paths”(名字可以随便起,只要和在manifest注册的provider所引用的resource保持一致即可)的资源文件。
上述代码中 path="" ,是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为 path="pictures" ,那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。

3、使用FileProvider
以打开相机为例(相册类似):

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

  if (Build.VERSION.SDK_INT >= 24) {
          intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
         //24以上使用FileProvider
          intent.putExtra(MediaStore.EXTRA_OUTPUT, 
          FileProvider.getUriForFile(getContext(), "包名.fileprovider", mTmpFile));
  }else{
          //24以下
          intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
       }


作者:满天星爱我
链接:http://www.jianshu.com/p/edec55192944
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值