适配android7.0获取文件的Uri的方法
作者:珠穆朗玛小王子 发布时间:2022-03-13 17:32:06
前言#
Android 7.0已经发布很久了,虽然市场份额还不是很高,但是流行起来都是早晚的事,所以适配Android 7.0刻不容缓。
Android 7.0 对系统进行了很多的优化:例如文件访问权限,省电,网络,后台等等,其中最突出的就是应用外的Uri访问。
什么时候会用到Uri的应用外访问呢?举一个简单的例子,下载apk更新,这个时候会调用系统功能来安装这个apk,这就是应用外访问文件,需要传入文件的Uri。
但是这样可能会显得不太安全,万一是什么非常重要的文件就糟糕了,所以Android 7.0对应用外访问的Uri要进行处理加密。
正文#
那应该怎么处理这个问题呢?首先我们需要注册ContentProvider,这个就很熟悉了,他可以把数据库的内容分享给其他应用,现在是为了分享文件:
//res目录下创建xml,设置要分享的目录,名称定义file_paths
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="myFile" path ="" />
</paths>
// 注册provider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.lzp.fileprovider"
android:exported="false"
// 赋予Uri权限
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
// 设置要分享的路径
android:resource="@xml/file_paths"/>
</provider>
设置分享的路径有三种:
<files-path/>代表的根目录: Context.getFilesDir()
<external-path/>代表的根目录:Environment.getExternalStorageDirectory()
<cache-path/>代表的根目录: getCacheDir()
provider注册完了之后,就需要稍微修改一下我们的java代码:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 判断是否是7.0
if(Build.VERSION.SDK_INT >= 24){
// 适配android7.0 ,不能直接访问原路径
// 需要对intent 授权
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setDataAndType(FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider",new File(filePath)),"application/vnd.android.package-archive");
}
else{
i.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive");
}
context.startActivity(i);
在java代码中,我们先判断了当前的手机的系统版本,如果是7.0以下就使用之前的Uri,如果是7.0以上,开始通过Provider来获取加密后的Uri。
最终得到的Uri的格式:
content://com.lzp.fileprovider/myFile/xxxxx.apk
看来主要是把分享出去的路径进行了加密,不能直接看到文件的完整路径。
总结#
ok,解决这个问题就是这么简单,如果是应用内访问文件是不受影响的,例如我们的读取图片之类的操作,由于时间比较紧,写的就比较简单了,之后再写点稍微高逼格一点的东西。
来源:http://www.jianshu.com/p/2db8e1c6a02d?utm_source=tuicool&utm_medium=referral


猜你喜欢
- 循环队列结构队列特点队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,
- 一,JDK环境变量;下载地址:HTTP://pan.baidu.com/s/1bpG3KYz1,新建变量名:JAVA_HOME,变量值:C:
- 基数排序也是桶排序的一种,也是跟样本数据强相关的,且基数排序要求样本数据是非负的十进制数,如果有小数或者负数,那么代码将要大量重写!这就是不
- Map 中ConcurrentHashMap是线程安全的,但不是所有操作都是,例如get()之后再put()就不是了,这时使用merge()
- 环境:maven+idea。1. 需要的jar包基本的spring和mybatis依赖包就不说了,在pom文件的build->plug
- 一、什么是过滤器过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制
- 把最近听的写的一些题目做下笔记!1.下列程序的执行,说法错误的是 ( ABC )public class MultiCatch
- Lambda 表达式Lambda 表达式是现代 C++ 中最重要的特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性
- 本文实例讲述了Java使用Iterator迭代器遍历集合数据的方法。分享给大家供大家参考,具体如下:1、使用迭代器遍历ArrayList集合
- 本文实例讲述了C#检测DataSet是否为空的方法。分享给大家供大家参考。具体如下:下面的代码片段通过判断DataSet的Table数量来判
- 多态概述多态概念:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定
- 本文实例讲述了Java爬取豆瓣电影数据的方法。分享给大家供大家参考,具体如下:所用到的技术有Jsoup,HttpClient。Jsoupjs
- 属性是提供对对象或类的特性进行访问的成员。属性提供功能强大的方法将声明信息与C#代码(类型,方法,属性等)相关联。属性的设置包括字符串的长度
- 现在的模拟器的功能太强大,从蓝牙,传感器等配件到IMEI,Mac,以及手机硬件信息什么都可以模拟为了防止用户利用模拟器模仿真机进行刷单,刷流
- 本文介绍了详解Android中PopupWindow在7.0后适配的解决,分享给大家,具体如下:这里主要记录一次踩坑的经历。需求:如上图左侧
- 写在前面从Java 1.0开始,引入java.io包;到Java 1.4再扩展了java.nio包;再到java 1.7又添加了新的流类,使
- 原生系统Android8.1上,WiFi上出现感叹号,此时WiFi可正常访问。原因这是Android 5.0引入的网络评估机制:就是当你连上
- 目录1 CompletionService介绍2 CompletionService源码分析3 CompletionService实现任务4
- Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框 可以肯定是字体的问题 解决
- 循环结构分两大类,一类是当型,一类是直到型。当型:当布尔值表达式条件为True时,反复执行某语句,当布尔表达式的值为False时才停止循环,