文章目录

  • 一、高低版本兼容代码及配置
    • 1.java代码
    • 2.AndroidManifest.xml 配置ContentProvider
    • 3.paths xml 配置
  • 二、老版本代码
  • 三、可能出的问题及处理

一、高低版本兼容代码及配置

高版本提高了sdcard、 app文件空间的访问权限,高低版本的系统api有一定区别,Android7.0 及以上,开放(暴露)私有数据文件的唯一方式是通过 ContentProvider 来实现(我们的app提供我们的文件给系统安装程序)。

基本步骤
1、在AndroidManifest.xml 中配置 ContentProvider 信息;
2、配置要开放的 paths 信息;
3、Java 代码中通过 FileProvider 封装文件信息。

1.java代码

private void install(String path) {File apk = new File(path);Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//注意第二个参数,要保持和manifest中android:authorities的值相同Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", apk);intent.setDataAndType(uri, "application/vnd.android.package-archive");} else {intent.setDataAndType(Uri.fromFile(apk), "application/vnd.android.package-archive");}try {context.startActivity(intent);} catch (Exception e) {e.printStackTrace();}}

特别注意
Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + “.fileProvider”, apk);
第二个参数一定要和provider 的android:authorities="${applicationId}.fileProvider"匹配。
applicationId是包名,context.getPackageName()也是包名,所以
context.getPackageName() + “.fileProvider”${applicationId}.fileProvider 是相同的字符串

2.AndroidManifest.xml 配置ContentProvider

配置安装权限

<!-- 应用安装权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

配置ContentProvider

<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_provider" />
</provider>

provider 属性说明:

  1. android:name 属性填写的是 FileProvider 类的完整名称。这个类可以填写两个值,一个是位于 support(android.support.v4.content.FileProvider) 包下的,另一个是位于 androidx(androidx.core.content.FileProvider) 包下的。这两种都可以填写,本质上没有区别。要根据实际情况来决定用哪个,即要看工程引的是 androidx 支援包还是 support 支援包。

  2. android:authorities 属性就是和普通的 ContentProvider 一样的用于访问文件资源的 uri 标签头。值内容根据实际需要来填写即可。

  3. android:exportedandroid:grantUriPermissions 两个属性的值照着填就好。大致是指允许其它应用单次使用自己的 Provider 资源。

  4. meta-data 标签中的内容需要关注的是 android:resource 属性中的内容。这个属性的值引向一个 xml目录的文件,这份 xml 文件描述要给其他应用访问的文件目录。

3.paths xml 配置

在工程 res 目录下新建一个 xml 没有的话新建)目录,则在目录中创建一个file_provider.xml(名称随意,和 android:resource=“@xml/file_provider” 一致即可),并在xml中添加需要对外提供的目录路径

<?xml version="1.0" encoding="utf-8"?>
<paths><external-pathname="path1"path="/data/dir1/" /><external-pathname="path2"path="/" /><external-files-pathname="path3"path="/data/dir2" /><external-cache-pathname="path4"path="/data/dir3" /><cache-pathname="path5"path="/data" /><files-pathname="path6"path="/ff" />
</paths>

简要说明:
不带external 是程序安装目录下的目录,cache-path 指程序安装目录下的cache目录。
带有external 的是指sdcard 目录下对应包名的专属目录,例如external-cache-path 指sdcard 目录下对应包名的专属cache目录。

例如下图是斗鱼直播的files目录:

<external-files-pathname="path3"path="/" />

对应下图

如果还有子目录,对应的增加接口,例如files 目录下的douyu, 那么xml如下:

<external-files-pathname="path3"path="/douyu/" />

二、老版本代码

老版本代码相对简单,粗暴且实用,只要知道 apk 的path,并拥有访问权限(sdcard),
再加上安装权限即可。

File apk = new File(apkPath);
Uri uri = Uri.fromFile(apk);
Intent intent = new Intent();
intent.setClassName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity");
intent.setData(uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

manifest 添加对应的权限

<!--sdcard 读权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

三、可能出的问题及处理

  1. java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)’ on a null object reference
    at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:591)
    原因:FileProvider.getUriForFile(context, context.getPackageName() + “.fileProvider”, apk); 第二个参数 “包名.fileProvider” 和 provider.xml 中 android:authorities=“${applicationId}.fileProvider” 的值(具体值:如com.eagle.app.fileProvider)不同,请仔细核对和修改一致。
  2. 权限问题
    一般app需要安装权限,除了在清单文件中列出外,还需要手动确认,注意留意并确认
  3. 下载的安装文件路径与file_provider 中描述的文件不匹配,仔细核对路径与描述。
  4. 安全提示要选择允许

Android代码安装apk程序相关推荐

  1. android 代码 安装APK 解决了

    今晚查了很多资料,android代码安装APK BaseHelper.chmod("777", cachePath); Intent intent = new Intent(Int ...

  2. 安卓java安装apk代码_Android 通过代码安装 APK的方法详解

    在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 Android系统版本的迭代,其对于权限的把控越来越 ...

  3. Android代码实现APK文件的安装与卸载

    Android代码实现APK文件的安装与卸载 Android程序使用代码的安装和卸载!!! 安装: String str = "/CanavaCancel.apk"; String ...

  4. Android 如何通过代码安装 APK

    在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 Android系统版本的迭代,其对于权限的把控越来越 ...

  5. Android 版本更新安装apk

    Android 版本更新安装apk 版本更新是每个安卓应用都会涉及的,当有新的版本更新下载后,调用系统安装程序安装新的apk,targetSdkVersion 在7.0以下时我们直接使用以下代码: / ...

  6. Android 下载安装APK

    代码安装apk Intent i = new Intent(Intent.ACTION_VIEW); String filePath = "/sdcard/XXX.apk"; i. ...

  7. java 安装apk_Android 如何通过代码安装 APK?

    2019-10-21 关键字:Java代码安装程序 在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 ...

  8. 解决Android Studio 安装APK时device support,but apk only supports armeabi-v7 问题

    报错信息: Android Studio 安装APK时出现 device support,but apk only supports armeabi-v7 问题出现原因: 这两天入职了新公司,公司统一 ...

  9. Android adb 安装 apk无法安装错误排查

    Android adb 安装 apk无法安装错误排查 过程描述 用锤子安装一个apk包,死活安装不上,直接安装apk报错[apk包解析错误],然后换成apk安装,adb报安装失败 但是nuex模拟器和 ...

最新文章

  1. PVN3D: 基于Deep Point-wise 3D关键点投票的6D姿态估计网络(香港科技大学提出)
  2. mysql开启慢查询方法(转)
  3. 微软MS10-046漏洞的利用
  4. 【转】产品经理如何进行BRD,MRD,PRD,DRD,FRD编写
  5. python求线段长度_python微元法计算函数曲线长度的方法
  6. Creating a Google Suggest Style Filter with the AutoComplete Control
  7. VBS去除指定的字符串中的重复项返回重复后的字符串
  8. 开始使用windows live writer写博客。
  9. commit(), commitNow()和commitAllowingStateLoss()
  10. solidworks新建工程图默认单位为毫米
  11. linux cat命令使用方法,Linux cat命令怎么使用
  12. 学编程脚本 android,Android开发之--脚本编程
  13. mysql virt虚拟内存_JVM占用VIRT虚拟内存高问题研究
  14. 微信小程序小型按钮内文字布局变形
  15. Java在c盘fld目录下的文件名_VBS脚本常用代码大全2011整理.docx
  16. 传奇游戏SF该如何选择服务器
  17. P2P流媒体开源项目介绍
  18. 从Foxmail向Thunderbird(TB)导出邮件
  19. c语言中 int和const int的区别
  20. 数据库第一范式、第二范式、第三范式、BCNF范式

热门文章

  1. 基金净值预测 建模方案 | 大数据+深度学习应用
  2. 记录-gitlab自动部署-git拉取代码失败构建失败 + linux系统升级git(yum安装 + 源码安装)
  3. TL-WDN5200H无线usb网卡在ubuntu18.04/16.04上的使用
  4. 终于等到了,十位Java架构师整理的“阿里P7”养成计划
  5. 深入理解计算机系统 第3章 程序的机器级表示
  6. 产品定位,什么是产品?什么是产品定位?
  7. [UOJ UNR #2]积劳成疾
  8. pg 快速造1000w测试数据
  9. mysql与pg的主键索引说明
  10. 某型车载导航软件测试