android7.0 获取uri
来源:互联网 发布:dnf深渊补丁软件 编辑:程序博客网 时间:2024/06/05 18:32
android7.0以后,使用Uri.fromFile会报FileUriExposedException异常,这是因为android7.0以后执行了更加严格的文件管理,要解决这一错误需要使用7.0新添加的FileProvide类,FileProvider官方文档:官方链接
FileProvider使用步骤:
1、定义一个FileProvider
在manifest里面定义一个FileProvider:
<manifest> ... <application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.mydomain.fileprovider" android:exported="false" android:grantUriPermissions="true"> ... </provider> ... </application></manifest>
name直接使用系统的android.support.v4.content.FileProvider,如果需要自己继承FileProvider,则在这里写自己的FileProvider,一定要写全名,即:包名+类名。exported设置为false,即FileProvider不需要共享,grantUriPermissions设置为true,即允许获取临时读取uri的权限。
2、指定可用文件
在res资源文件夹下建立xml文件夹,在xml文件夹下创建一名为file_paths的资源文件:
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images"/> ...</paths>
paths元素必须包含以下一个或者多个子元素:
- files-path 对应目录Context.getFilesDir()
- cache-path 对应目录Context.getCacheDir()
- external-path 对应目录Environment.getExternalStorageDirectory()
- external-files-path 对应目录Context,getExternalFilesDir(String) 或者Context.getExternalFilesDir(null)
- external-cache-path 对应目录Context.getExternalCacheDir()。
这一点要谨记,在后面创建文件时会用到。
name 是分享的文件路径的一部分,它会覆盖要分享的真实的路径,即path指定的路径。
path 即文件真实路径,最后创建出来的文件路径为(参照上述例子):Context.getFilesDir()+path+”/”+文件名。
然后在第一步的provider中引用这个资源文件:
<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>
3、生成Uri
首先创建文件:
File imagePath = new File(Context.getFilesDir(), "images");File newFile = new File(imagePath, "default_image.jpg");
在创建第一个文件即imagePath时,使用Context.getFilesDir()是因为第二步的资源文件里面使用了files-path,如改成external-path,则这里要改成Environment.getExternalStorageDirectory(),其余皆同。“images”对应的是第二步资源文件里面的path资源。最终newFile的文件名为:Context.getFilesDir()+”images/default_image.jpg”。
接下来,生成Uri:
Uri contentUri = FileProvider.getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
getUriForFile方法中的第二个参数要与第一步中在manifest文件里面创建的provider里面的android:authorities名称一样。
4、分享
使用intent分享文件时,要加入临时权限,已拍照为例:
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); i.putExtra(MediaStore.EXTRA_OUTPUT, contentUri); startActivity(i);
- android7.0 获取uri
- 适配android7.0:获取文件的Uri
- 适配android7.0:获取文件的Uri
- 兼容Android7.0传递图片的URI
- android7.0 权限获取
- Android7.0无需FileProvide搞定URI拍照、应用安装问题
- Android7.0中尝试传递 file:// URI 会触发 FileUriExposedException
- android7.0 SD Card 路径获取
- Android7.0 获取手机蓝牙MAC地址
- Android7.0 获取蓝牙设备电量
- Android7.0 获取其他应用数据流量
- 获取URI
- 获取URI
- android7.0
- Android7.0华为Mate9开发获取WiFi列表失败
- Android7.0文件读写(获取拍照结果)笔记
- Uri获取文件路径
- uri获取路径
- 每天学算法
- Mac 使用SCP 上传和下载文件
- Maven简介
- js鼠标进度条失去焦点拖动
- 函数
- android7.0 获取uri
- kafka的消息消费机制、consumer的负载均衡、文件存储机制
- 4招搞定greenDAO导致的各类崩溃问题
- shell 基础
- javascript实现日历效果
- 安卓布局文件无法预览第三方控件
- 字符扩展
- PHPcms常用的PC标签
- linux下创建新用户以及删除