7.0手机打开相机或相册报错解决方案,记录。

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

原因

在Android7.0系统上, 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常,如调用系统相机拍照,或裁切照片。

解决方案

官方文档

参考博客

满天星爱我
鸿洋_ Android 7.0 行为变更 通过FileProvider在应用间共享文件吧

具体步骤

1. 在清单文件中注册一个FileProvider
2. 创建FileProvider使用的xml文件
3. 实现URI和Intenet跳转

1. 在清单文件中注册一个FileProvider

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

需要注意:android:authorities属性值是可变的(可以改成你自己喜欢的)。标签中android:name属性值是固定的。android:resource属性值为第二步中我们创建的xml文件名称。

2. 创建FileProvider使用的xml文件

(文件路径:res>xm>file_paths)


<paths>

    <files-path
        name="name"
        path="pics" />
    <cache-path
        name="name"
        path="pics" />
    <external-files-path
        name="name"
        path="pics" />
    <external-path
        name="name"
        path="pics" />
paths>

不同的标签代表不同的目录。

  • < root-path /> 代表设备的根目录new File("/");
  • < files-path /> 代表context.getFilesDir()
  • < cache-path /> 代表context.getCacheDir()
  • < external-path /> 代表Environment.getExternalStorageDirectory()
  • < external-files-path />代表context.getExternalFilesDirs()
  • < external-cache-path />代表getExternalCacheDirs()

标签下的path代表路径下的子目录。如:

<external-path
        name="external"
        path="pics" />

表示代表的目录即为:Environment.getExternalStorageDirectory()/pics,其他同理。

3. 实现URI和Intenet跳转

 		Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        File file = new File(AppConfig.APP_IMG_SAVE_PATH, String.valueOf(System.currentTimeMillis()) + ".jpg");
        photoPath = file.getPath();
        Uri data = FileProvider.getUriForFile(this,"com.mydomain.fileprovider", file);
            // 给目标应用一个临时授权
        openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        
        //指定存储路径,保存原图
        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, data);
        startActivityForResult(openCameraIntent, ComConstant.ActivityRequestCode.PICTURE_FROM_CAPTURE);

这样就不会有问题了。试了一下向下兼容的不需要区分API。

最后本人开了一个贝店。

微信号TEL18756061915

你可能感兴趣的:(报错)