Android7.0适配APK安装

适配的原因

  1. 对于面向Android7.0的应用,Android框架执行的StrictMode API政策禁止在您的应用外部公开file://URL。如果一项包含文件URL的intent离开您的应用,则应用出现故障,并出现FileUriExposedException异常。
  2. 要在应用间共享文件,您应发送一项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
  1. <provider
  2. android:name="android.support.v4.content.FileProvider"
  3. android:authorities="com.readboy.lee.AppUpdate.fileprovider"
  4. android:exported="false"
  5. android:grantUriPermissions="true">
  6. <meta-data
  7. android:name="android.support.FILE_PROVIDER_PATHS"
  8. android:resource="@xml/file_paths" />
  9. </provider>

注意:android:authorities的值,最好设为包名+“fileprovider”,如果有两个应用都注册了同样的FileProvider,是会报错的。

2.添加资源文件

在AndroidMainfest.xml中声明的FileProvider中android:resource的值对应的文件需要我们自己添加,在res文件夹下创建一个xml文件夹,并创建file_paths.xml文件。如果已经有xml文件夹,则直接创建file_paths.xml文件即可。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <paths xmlns:android="http://schemas.android.com/apk/res/android">
  3. <files-path name="files-path" path="/." />
  4. <cache-path name="cache-path" path="/." />
  5. <external-path name="external-path" path="/." />
  6. <external-files-path name="external-files-path" path="/." />
  7. <external-cache-path name="external-cache-path" path="/." />
  8. </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
  1. Intent intent = new Intent(Intent.ACTION_VIEW);
  2. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  3. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  4. Uri uri = FileProvider.getUriForFile(context,"com.readboy.lee.AppUpdate.fileprovider",new File(path));
  5. intent.setDataAndType(uri,"application/vnd.android.package-archive");
  6. intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  7. } else {
  8. intent.setDataAndType(Uri.parse("file://" + path),"application/vnd.android.package-archive");
  9. }
  10. context.startActivity(intent);

当SDK大于等于7.0时,使用FileProvider获取Uri值,然后再传递出去。

总结

因为看网上的这块,踩了很多坑,自己总结一下,方便后期的查看。

Android7.0适配APK安装的更多相关文章

  1. fir.im Weekly - 关于 Log Guru 开源、Xcode 探索和 Android7.0 适配

    本期 fir.im Weekly 整理了最近的一些技术分享,包括关于 Log Guru 开源.Xcode 探索. Android7.0 适配等等 iOS/Android 相关的工具.源码分享和技术文章 ...

  2. 【转】Android7.0适配心得

    本文出自:贾鹏辉的技术博客(http://www.devio.org) http://www.devio.org/2016/09/28/Android7.0%E9%80%82%E9%85%8D%E5% ...

  3. 下载安装APK(兼容Android7.0)

    我们使用手机的时候经常会看到应用程序提示升级,大部分应用内部都需要实现升级提醒和应用程序文件(APK文件)下载. 一般写法都差不多,比如在启动app的时候,通过api接口获得服务器最新的版本号,然后和 ...

  4. Android 升级安装APK兼容Android7.0,解决FileUriExposedException

    我们在开发app时避免不了需要添加应用内升级功能.当app启动时,如果检测到最新版本,将apk安装包从服务器下载下来,执行安装.安装apk的代码一般写法如下,网上随处可以搜到 public stati ...

  5. Appium适配Android7.0以上版本

    Appium适配Android7.0以上版本 测试机型: 华为荣耀V9 安卓版本: Android7.0 appium版本: 1.65 说明: 公司新采购了一批安卓机器,拿了其中一台华为荣耀V9跑之前 ...

  6. Android7.0新特性,及Android N适配

    新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...

  7. [转]Android 应用自动更新及6.0,7.0,8.0适配安装

    原贴:https://www.jianshu.com/p/ea42040c7ace 原贴:https://www.jianshu.com/p/ea42040c7ace 原贴:https://www.j ...

  8. Android7.0无需FileProvide搞定URI拍照、应用安装问题

    根据官方文档,从Android7.0版本开始 使用URI打开或安装文件需要单独在应用里配置了,问了度娘,有好多版本的结果,个人认为最靠谱的就是下边这个方法,只需在application的oncreat ...

  9. Android7.0 多窗口你值得拥有

    Android7.0 多窗口你值得拥有 什么是多窗口分屏? 多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了"分屏多任务"和"APP窗口化"功能,但这些 ...

随机推荐

  1. 使用CSV控件方法实现参数化

    一.录制脚本 二.下面介绍如何使用CSV控件方法实现参数化 1.  添加-->配置元件-->csv Data Set Config Filename:文件的来源 Variable Name ...

  2. Unity正交模式摄像机与屏幕适配的方法

    public class CameraAuto : MonoBehaviour { float fDefaultRatio = 720.0f / 1280.0f;//预先设定屏幕大小1280*720 ...

  3. 解决Jenkins用shell脚本部署后,Jenkins自动杀掉启衍生出来的守护进程

    Jenkins部署java项目遇到的问题: 1.Jenkins执行构建后,需要手动执行startup.sh,站点才能正常访问 产生原因: shell脚本发布时,会衍生进程,Jenkins默认会自动杀掉 ...

  4. mac 删除文件不经过废纸篓解决办法

    mac 删除文件不经过废纸篓,提示“此项目将被立刻删除,您不能撤销此操作.”,解决办法. 终端机运行两个命令: rm -R ~/.Trash killall Finder 退出终端机. ------- ...

  5. lombok的简单介绍

    ##lombok的使用 一直在使用lombok的set和get,对其他的功能用的比较少,蓦然发现这个库好用的功能不要太多啊 有必要深入理解一番. ###lombok安装 1 需要IDE支持,不然开发的 ...

  6. linux学习第十三天 (Linux就该这么学)找到一本不错的Linux电子书

    今天主要讲了vftp 服务的配置,不家三种访问方式   一,匿名访问模式  二,本地访问模式   三,虚拟用户模式  和,tftp简单文件传输协议 也讲了要孝试的服务,sabma服务的配置,及wind ...

  7. HttpWebRequest 自定义header,Post发送请求,请求形式是json,坑爹的代码

    public static string PostMoths(string url, LoginDTO obj_model, Dictionary<string, string> dic ...

  8. S系统的不好的实践

    多个项目 多个分支放在一个SVN里边维护,导致多股力量并行开发时候的代码覆盖的风险可能性很大,,  好的实践是维护独立的SVN,彼此分离开来

  9. C++动态库的几点认识

    1.动态库也有lib文件,称为导入库,一般大小只有几k: 2.动态库有静态调用和动态调用两种方式: 静态调用:使用.h和.lib文件 动态调用: 先LoadLibrary,再GetProcAddres ...

  10. LOJ-10092(最大半连通子图)

    题目连通:传送门 思路: 题目定义很清晰,然后就不会了QAQ…… 后来看了书,先缩点,然后再用拓扑排序找到最长的链子的节点数(因为缩点后所有点都是一个强连通分量,所以找最长的链子就是最大限度包含 点的 ...