适配android7.0获取文件的Uri的方法
Android 7.0 获取文件的 Uri 的方法 Android 7.0 对系统进行了很多的优化,例如文件访问权限,省电,网络,后台等等,其中最突出的就是应用外的 Uri 访问。什么时候会用到 Uri 的应用外访问呢?例如下载 apk 更新,这个时候会调用系统功能来安装这个 apk,这就是应用外访问文件,需要传入文件的 Uri。但是这样可能会显得不太安全,万一是什么非常重要的文件就糟糕了,所以 Android 7.0 对应用外访问的 Uri 要进行处理加密。 在 Android 7.0 中,需要注册 ContentProvider,这个就很熟悉了,他可以把数据库的内容分享给其他应用,现在是为了分享文件。首先需要在 res 目录下创建 xml,设置要分享的目录,名称定义 file_paths: ```xml <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="myFile" path="" /> </paths> ``` 然后需要注册 provider: ```xml <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.lzp.fileprovider" android:exported="false" 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 代码: ```java Intent i = new Intent(Intent.ACTION_VIEW); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= 24) { // 适配 android 7.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 看来主要是把分享出去的路径进行了加密,不能直接看到文件的完整路径。 适配 Android 7.0 获取文件的 Uri 的方法就是注册 ContentProvider,设置分享的路径,修改 java 代码来获取加密后的 Uri。这样可以确保文件的安全,避免了文件被恶意访问。
- 粉丝: 5
- 资源: 956
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助