在android7.0上,我们需要在应用内实现更新apk并且安装包的时候,无法再像之前那样了。随着Android版本越来越高,Android对隐私的保护力度也越来越大。比如:Android6.0引入的动态权限控制(Runtime Permissions),Android7.0又引入“私有目录被限制访问”,“StrictMode API 政策”
“私有目录被限制访问“ 是指在Android7.0中为了提高私有文件的安全性,面向 Android N 或更高版本的应用私有目录将被限制访问。
" StrictMode API 政策" 是指禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。
7.0安装apk
1.在AndroidManifest中注册FileProvide
2.在xml文件夹中创建file_paths文件,来声明可以访问的路径
name是代表别名,用来隐藏文件夹,path才是真实的子目录路径FileProvider所支持的几种path类型
<files-path name="name" path="path">
该方式提供在应用的内部存储区的文件/子目录的文件。它对应Context.getFilesDir返回的路径:eg:"/data/data/包名/files"。
<cache-pathname="name" path="path">
该方式提供在应用的内部存储区的缓存子目录的文件。它对应getCacheDir返回的路径:eg:“/data/data/包名/cache”;
<external-path name="name" path="path">
该方式提供在外部存储区域根目录下的文件。它对应Environment.getExternalStorageDirectory返回的路径:eg:"/storage/emulated/0";
<external-files-path name="name" path="path">
该方式提供在应用的外部存储区根目录的下的文件。它对应Context.getExternalFilesDir(String) Context.getExternalFilesDir(null)返回的路径。eg:"/storage/emulated/0/Android/data/包名/files"。
<external-cache-path name="name" path="path" >
该方式提供在应用的外部缓存区根目录的文件。它对应Context.getExternalCacheDir()返回的路径。eg:"/storage/emulated/0/Android/data/包名/cache"。
这些类型在Android手机内部存储区文件共享是可以的,但对于外置SD卡是不行的,如果你想通过FileProvider.getUriForFile()获取一个外置SD卡的Uri则会报出
java.lang.IllegalArgumentException- Failed to find configured root that contains
解决办法是在file_paths文件中添加<root_path />节点
最后,安装apk的方法
官方文档地址:
https://developer.android.google.cn/reference/android/support/v4/content/FileProvider
网友评论