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安装的更多相关文章

  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. C# 线程获取/设置控件(TextBox)值

    线程读写控件需要用委托(delegate)与Invoke/BeginInvoke来进行 参考内容:http://www.cnblogs.com/runner/archive/2011/12/30/23 ...

  2. P1439 最长公共子序列(nlognLCS问题)

    模板 #include <iostream> #include <cstdio> using namespace std; ],loc[],b[],k,n,l,r,mid; i ...

  3. Java发送手机短信(附代码和解析,亲测有效,简便易操作)

    这个方法用的是中国网建SMS短信通相关依赖进行操作的~~ 很简单,仅需要三步,第二部代码直接复制,不需要修改,第三部中的用户名和密钥修改成自己的即可 <1> 首先需要导入三个jar包 &l ...

  4. Atom使用

    cmd-r 通过方法名查找 ctrl-option-g 跳转至光标所在方法或结构 安装 last-cursor-position 后 alt-- 返回至光标上一次所在位置

  5. jquery学习总结24-36

    一.jquery的自定义事件 1.自定义事件不能通过eventName()来添加,只能通过on来绑定 2.自定义事件需要通过trigger(自动触发)来进行触发 二.jauery事件命名空间 1.事件 ...

  6. VS2017离线安装入门与出家

    重做系统,并且VS2017也发布有一段时间了,可以试试了. 于是网上搜了下,离线安装要下载他的安装工具. https://www.visualstudio.com/zh-hans/downloads/ ...

  7. PAT乙级1003

    1003 我要通过! (20 point(s)) “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”, ...

  8. Python字符串格式化--format()方法

    https://blog.csdn.net/i_chaoren/article/details/77922939       csdn

  9. cordova 问题汇总

    用chrome进行调试: https://jingyan.baidu.com/album/db55b609fde96d4ba30a2fa9.html?picindex=8 http://rensann ...

  10. go网络编程应用

    网络编程基础(聊天室) 服务端 package main import ( "fmt" "net" "strings" "os&q ...