如何在安卓应用内部安装内置的APK安装包?
APK不建议直接放在raw资源目录下使用。raw目录下的资源只能通过Android资源ID的方式访问,无法直接获取到对应的本地文件路径,系统包安装器无法直接读取该路径下的私有资源,你之前出现ActivityNotFoundException的核心原因就是传给安装意图的Uri无法被系统识别。
可用的存放方案
- 存放在
assets目录:这是最常用的方案,也就是你现在正常运行的代码所用的方案。assets下的文件可以通过AssetManager打开输入流,先将APK文件拷贝到应用私有缓存目录/文件目录,再通过FileProvider生成可被外部访问的Uri传给安装器即可正常触发安装流程。 - 若要使用
raw目录:也可以实现,操作逻辑和assets方案一致,将raw目录下的APK通过资源ID打开输入流,拷贝到可访问的本地文件路径后再生成Uri即可,不能直接使用raw资源对应的Uri传入安装意图。
补充优化点
你当前代码里拷贝文件的逻辑有小问题,inputStream.available()返回的是当前立即可读的字节数,不是APK文件的总大小,安装大体积APK时容易出现拷贝不全的情况,建议修改为循环读取的写法:
InputStream inputStream = getAssets().open("longer.apk"); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != -1) { fos.write(buffer, 0, len); } inputStream.close(); fos.close();
另外要注意,canRequestPackageInstalls()返回false时,需要主动跳转权限申请页面引导用户开启「安装未知应用」权限,否则安装逻辑不会执行。
内容的提问来源于stack exchange,提问作者user15603244
相关产品推荐
相关产品推荐

