Android 7.0获取文件Uri适配
来源:互联网 发布:淘宝网络科技有限公司 编辑:程序博客网 时间:2024/06/02 03:48
问题
在SDK升级到Android N,通过Uri.fromFile(file)获取Uri报 android.os.FileUriExposedException异常,因为在Android 7.0系统上,Android框架强制执行了StrictMode API政策禁止向应用外公开file:// URI, 如果Intent包含了file://类型的URI离开应用,抛出异常,退出程序。
解决办法
使用FileProvider获取URI。
第一步:清单文件注册provider
<provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths"/> </provider>${applicationId }:你的应用包名
exported="false":设置成false就好了,true会抛异常
grantUripermissions="true":表示授予访问URI权限
resources="@xml/filepaths":指定共享目录的配置文件
第二步:创建共享目录配置文件:filepaths.xml(第一步中指定的resource文件)
<!--FileProvider提供的共享目录配置文件--><paths> <!--内置SD卡 Environment.getExternalStorageDirectory() .表示共享所有的目录,也可以指定共享的目录--> <external-path name="external-path" path="."/> <!--内置SD卡 Context.getExternalCacheDir() .表示共享所有的目录,也可以指定共享的目录--> <external-cache-path name="external-cache-path" path="."/> <!--内置SD卡 Context.getExternalFilesDir(null) .表示共享所有的目录,也可以指定共享的目录--> <external-files-path name="external-files-path" path="."/> <!--data目录下 Context.getFilesDir() .表示共享所有的目录,也可以指定共享的目录--> <files-path name="files_path" path="."/> <!--data缓存目录 Context.getCacheDir() .表示共享所有的目录,也可以指定共享的目录--> <cache-path name="cache-path" path="."/> <!--这个标签Android官方文档中是没有提及,Android设备的根目录,该目录下包含着手机内部存储器,外置SD卡等所有文件的目录--> <root-path name="name" path="."/></paths>通过这写目录配置,基本覆盖了手机中所有目录的权限, 外置SD卡对应共享目录的权限需要配置自定义的root-path中。
第三步:通过FileProvider.getUriForFile(context,authorities,file)获取URI
/** * 根据文件转换成对应的Uri * * @param ctx * @param file * @return */ public static Uri file2Uri(Context ctx, File file) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return FileProvider.getUriForFile(ctx, BuildConfig.APPLICATION_ID + ".fileprovider", file); } else { return Uri.fromFile(file); } }
BuildConfig.APPLICATION_ID:应用包名
file:需要转换成URI的文件,这里file路径必须在filepaths.xml中配置path,否则,报 java.lang.IllegalArgumentException: Failed to find configured root异常。
总结
主要是通过设置配置文件来控制共享目录, 主要涉及URI适配的功能:拍照,裁剪,安装应用等等。
- Android 7.0获取文件Uri适配
- android 根据Uri获取文件绝对路径
- android根据Uri获取文件路径
- Android 通过Uri获取文件路径
- android 根据Uri获取文件目录
- 适配android7.0:获取文件的Uri
- 适配android7.0:获取文件的Uri
- Uri获取文件路径
- android根据uri或文件绝对路径获取文件基本信息
- Android选择文件及通过Uri获取文件路径
- android根据uri或文件绝对路径获取文件基本信息
- android 获取uri的正确文件路径的办法
- android 获取uri的正确文件路径的办法
- android 获取uri的正确文件路径的办法
- Android通过Uri获取文件的路径的方法
- 安卓[android] 通过Uri获取File文件
- Android 获取uri的正确文件路径的办法
- Android——通过Uri获取文件的路径
- File类
- 催收员电话骚扰欠债者竟被抓,原因是暴力催收
- 内存地址空间与分配
- Oozie分布式任务的工作流——Sqoop篇
- 数人云|PaaS Innovation 2017开幕在即,共襄技术演进与商业碰撞盛宴
- Android 7.0获取文件Uri适配
- Android8.0 Email 一个Bug修改方案
- Linux tcpdump命令详解
- javascript:;与javascript:void(0)使用介绍
- jquery表单过滤选择器
- 将Excel数据转换成FlatBuffer数据的方法
- Codeforces Round #443 (Div. 2) E. Tournament
- 反射(提供封装程序集、模块和类型的对象)
- Syabse数据库无法启动的数据恢复案例