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)

<?xml version="1.0" encoding="utf-8"?>
<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。

最后本人开了一个贝店。下载贝店记得填写邀请码10264421

微信号TEL18756061915

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值