Android7.0适配APK安装
Android7.0适配APK安装
适配的原因
对于面向Android7.0的应用,Android框架执行的StrictMode API政策禁止在您的应用外部公开file://URL。如果一项包含文件URL的intent离开您的应用,则应用出现故障,并出现FileUriExposedException异常。
要在应用间共享文件,您应发送一项content://URL,并授予URL临时访问权限。进行此授权的最简单方式是使用FileProvider类。
官网文章地址:https://developer.android.google.cn/reference/android/support/v4/content/FileProvider?hl=zh-cn
上面的两段话来自Android开发者平台的版本Android7.0行为变更中。
由于调用系统的安装,需要传递一个Uri对象,导致包含文件URL的intent离开了本应用,所以导致报错,安装APK的代码无法在Android7.0上正常使用,所以要进行修改获取Uri的方式。
适配的方法
从官方文档中看到需要使用FileProvider类来授予URL临时访问权限,依次来解决安装APK的问题。
使用FileProvider分为三个步骤:
1.在AndroidMainfest.xml文件中声明FileProvider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.readboy.lee.AppUpdate.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
注意:android:authorities的值,最好设为包名+“fileprovider”,如果有两个应用都注册了同样的FileProvider,是会报错的。
2.添加资源文件
在AndroidMainfest.xml中声明的FileProvider中android:resource的值对应的文件需要我们自己添加,在res文件夹下创建一个xml文件夹,并创建file_paths.xml文件。如果已经有xml文件夹,则直接创建file_paths.xml文件即可。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files-path" path="/." />
<cache-path name="cache-path" path="/." />
<external-path name="external-path" path="/." />
<external-files-path name="external-files-path" path="/." />
<external-cache-path name="external-cache-path" path="/." />
</paths>
上面的就是file_paths.xml里面的内容。
paths里面的界面分别代表:
<files-path/>代表context.getFileDir()<cache-path/>代表context.getCacheDir()<external-path/>代表Environment.getExternalStorageDirectory()<external-files-path/>代表context.getExternalFilesDirs()<external-cache-path/>代表context.getExternalCacheDirs()
path="/."表示的是当前目录下的所有目录。
注意:如果你选择吧这些选项全部都加到资源文件中,那么这些条目的name属性值要互不相同。
声明之后,代码中就可以使用所声明的当前文件夹以及其子文件夹。
3.在代码中使用FileProvider
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri uri = FileProvider.getUriForFile(context,"com.readboy.lee.AppUpdate.fileprovider",new File(path));
intent.setDataAndType(uri,"application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
intent.setDataAndType(Uri.parse("file://" + path),"application/vnd.android.package-archive");
}
context.startActivity(intent);
当SDK大于等于7.0时,使用FileProvider获取Uri值,然后再传递出去。
总结
因为看网上的这块,踩了很多坑,自己总结一下,方便后期的查看。
Android7.0适配APK安装的更多相关文章
- fir.im Weekly - 关于 Log Guru 开源、Xcode 探索和 Android7.0 适配
本期 fir.im Weekly 整理了最近的一些技术分享,包括关于 Log Guru 开源.Xcode 探索. Android7.0 适配等等 iOS/Android 相关的工具.源码分享和技术文章 ...
- 【转】Android7.0适配心得
本文出自:贾鹏辉的技术博客(http://www.devio.org) http://www.devio.org/2016/09/28/Android7.0%E9%80%82%E9%85%8D%E5% ...
- 下载安装APK(兼容Android7.0)
我们使用手机的时候经常会看到应用程序提示升级,大部分应用内部都需要实现升级提醒和应用程序文件(APK文件)下载. 一般写法都差不多,比如在启动app的时候,通过api接口获得服务器最新的版本号,然后和 ...
- Android 升级安装APK兼容Android7.0,解决FileUriExposedException
我们在开发app时避免不了需要添加应用内升级功能.当app启动时,如果检测到最新版本,将apk安装包从服务器下载下来,执行安装.安装apk的代码一般写法如下,网上随处可以搜到 public stati ...
- Appium适配Android7.0以上版本
Appium适配Android7.0以上版本 测试机型: 华为荣耀V9 安卓版本: Android7.0 appium版本: 1.65 说明: 公司新采购了一批安卓机器,拿了其中一台华为荣耀V9跑之前 ...
- Android7.0新特性,及Android N适配
新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...
- [转]Android 应用自动更新及6.0,7.0,8.0适配安装
原贴:https://www.jianshu.com/p/ea42040c7ace 原贴:https://www.jianshu.com/p/ea42040c7ace 原贴:https://www.j ...
- Android7.0无需FileProvide搞定URI拍照、应用安装问题
根据官方文档,从Android7.0版本开始 使用URI打开或安装文件需要单独在应用里配置了,问了度娘,有好多版本的结果,个人认为最靠谱的就是下边这个方法,只需在application的oncreat ...
- Android7.0 多窗口你值得拥有
Android7.0 多窗口你值得拥有 什么是多窗口分屏? 多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了"分屏多任务"和"APP窗口化"功能,但这些 ...
随机推荐
- windows下Docker的安装
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- thinkphp 响应对象
<?php namespace app\admin\controller; use think\Request; class Index{ public function index(Reque ...
- Unity 角色移动贴墙行走
直接贴上代码,旋转角色角度检测碰撞 Vector2 v2Normal = new Vector2(normal.x, normal.y); float fAngle = Vector2.SignedA ...
- 使用Druid作为SpringBoot项目数据源(添加监控)
Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目.Druid支持所有JDBC兼容数据库,包括了Oracle.MySQL.PostgreSQL.SQL Server.H2等.Druid在监 ...
- How to get raw request body in ASP.NET?
protected void Page_Load(object sender, EventArgs e) { MemoryStream memstream = new MemoryStream(); ...
- Spring 缓存注解之@Cacheable,@CacheEvit
Spring引入了Cache的支持,其使用方法类似于Spring对事务的支持.Spring Cache是作用于方法上的,其核心思想是,当我们调用一个缓存方法时,把该方法参数和返回结果作为一个键值对存放 ...
- ajax 参数记录
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- P3806 【模板】点分治1
一道淀粉质的模版题,开始是暴力 #include <bits/stdc++.h> #define up(i,l,r) for(register int i = (l); i <= ( ...
- golang 快速排序及二分查找
二分查找 func main() { arr := []int{0, 1, 2, 3, 4, 5, 6} fmt.Println(BinarySearch(arr, 5)) } func Binary ...
- cURL error 60: SSL certificate problem...
php在curl的时候报错 cURL error 60: SSL certificate problem: unable to get local issuer certificate (see ht ...