Android代码安装apk程序
文章目录
- 一、高低版本兼容代码及配置
- 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 属性说明:
android:name
属性填写的是 FileProvider 类的完整名称。这个类可以填写两个值,一个是位于 support(android.support.v4.content.FileProvider) 包下的,另一个是位于 androidx(androidx.core.content.FileProvider) 包下的。这两种都可以填写,本质上没有区别。要根据实际情况来决定用哪个,即要看工程引的是 androidx 支援包还是 support 支援包。android:authorities
属性就是和普通的 ContentProvider 一样的用于访问文件资源的 uri 标签头。值内容根据实际需要来填写即可。android:exported
与android:grantUriPermissions
两个属性的值照着填就好。大致是指允许其它应用单次使用自己的 Provider 资源。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" />
三、可能出的问题及处理
- 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)不同,请仔细核对和修改一致。 - 权限问题
一般app需要安装权限,除了在清单文件中列出外,还需要手动确认,注意留意并确认 - 下载的安装文件路径与file_provider 中描述的文件不匹配,仔细核对路径与描述。
- 安全提示要选择允许
Android代码安装apk程序相关推荐
- android 代码 安装APK 解决了
今晚查了很多资料,android代码安装APK BaseHelper.chmod("777", cachePath); Intent intent = new Intent(Int ...
- 安卓java安装apk代码_Android 通过代码安装 APK的方法详解
在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 Android系统版本的迭代,其对于权限的把控越来越 ...
- Android代码实现APK文件的安装与卸载
Android代码实现APK文件的安装与卸载 Android程序使用代码的安装和卸载!!! 安装: String str = "/CanavaCancel.apk"; String ...
- Android 如何通过代码安装 APK
在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 Android系统版本的迭代,其对于权限的把控越来越 ...
- Android 版本更新安装apk
Android 版本更新安装apk 版本更新是每个安卓应用都会涉及的,当有新的版本更新下载后,调用系统安装程序安装新的apk,targetSdkVersion 在7.0以下时我们直接使用以下代码: / ...
- Android 下载安装APK
代码安装apk Intent i = new Intent(Intent.ACTION_VIEW); String filePath = "/sdcard/XXX.apk"; i. ...
- java 安装apk_Android 如何通过代码安装 APK?
2019-10-21 关键字:Java代码安装程序 在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 ...
- 解决Android Studio 安装APK时device support,but apk only supports armeabi-v7 问题
报错信息: Android Studio 安装APK时出现 device support,but apk only supports armeabi-v7 问题出现原因: 这两天入职了新公司,公司统一 ...
- Android adb 安装 apk无法安装错误排查
Android adb 安装 apk无法安装错误排查 过程描述 用锤子安装一个apk包,死活安装不上,直接安装apk报错[apk包解析错误],然后换成apk安装,adb报安装失败 但是nuex模拟器和 ...
最新文章
- PVN3D: 基于Deep Point-wise 3D关键点投票的6D姿态估计网络(香港科技大学提出)
- mysql开启慢查询方法(转)
- 微软MS10-046漏洞的利用
- 【转】产品经理如何进行BRD,MRD,PRD,DRD,FRD编写
- python求线段长度_python微元法计算函数曲线长度的方法
- Creating a Google Suggest Style Filter with the AutoComplete Control
- VBS去除指定的字符串中的重复项返回重复后的字符串
- 开始使用windows live writer写博客。
- commit(), commitNow()和commitAllowingStateLoss()
- solidworks新建工程图默认单位为毫米
- linux cat命令使用方法,Linux cat命令怎么使用
- 学编程脚本 android,Android开发之--脚本编程
- mysql virt虚拟内存_JVM占用VIRT虚拟内存高问题研究
- 微信小程序小型按钮内文字布局变形
- Java在c盘fld目录下的文件名_VBS脚本常用代码大全2011整理.docx
- 传奇游戏SF该如何选择服务器
- P2P流媒体开源项目介绍
- 从Foxmail向Thunderbird(TB)导出邮件
- c语言中 int和const int的区别
- 数据库第一范式、第二范式、第三范式、BCNF范式
热门文章
- 基金净值预测 建模方案 | 大数据+深度学习应用
- 记录-gitlab自动部署-git拉取代码失败构建失败 + linux系统升级git(yum安装 + 源码安装)
- TL-WDN5200H无线usb网卡在ubuntu18.04/16.04上的使用
- 终于等到了,十位Java架构师整理的“阿里P7”养成计划
- 深入理解计算机系统 第3章 程序的机器级表示
- 产品定位,什么是产品?什么是产品定位?
- [UOJ UNR #2]积劳成疾
- pg 快速造1000w测试数据
- mysql与pg的主键索引说明
- 某型车载导航软件测试