需求情景是这样的,需要在程序启动时对比Apk版本并下载新版本Apk文件存储到本地,然后调用Android弹出安装Apk界面,本文主要是描述如何实现程序内部覆盖安装Apk。

1, 在Unity端调用Android端的安装Apk的方法

首先在Unity端写一个调用Java代码的方法,调用Java的 “InstallApk” 方法。

 void InstallApk(string path) {AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");string apkPath = path;jo.Call("InstallApk", apkPath);}

开发过程中发现如果Apk文件路径前加 ”file://“ 前缀会在Java端报错找不到Apk文件的错误。

2,在Android端实现安装Apk的方法

网上所Android 7.0一下版本直接调用 Android的 intent 就可以弹出安装的界面,Android 7.0 行为变更所以直接调用 intent 无法弹出安装界面,需要通过 “FileProvider” 安装, 具体代码如下:

/*** 自动弹出安装APK的界面* @param apkPath  apk包所在路径*/public void InstallApk(String apkPath) {System.out.println("Android下载地址:" + apkPath);File file = new File(apkPath);Intent intent = new Intent(Intent.ACTION_VIEW);if (Build.VERSION.SDK_INT >= 24) { //Android 7.0及以上intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 参数2 清单文件中provider节点里面的authorities ; 参数3  共享的文件,即apk包的file类Uri apkUri = FileProvider.getUriForFile(getApplicationContext(), this.getPackageName() + ".fileprovider", file);//记住修改包名//对目标应用临时授权该Uri所代表的文件intent.setDataAndType(apkUri, "application/vnd.android.package-archive");} else {intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}this.startActivity(intent);}

3,相关配置

3.1,在Manifest中定义provider标签

添加provider标签

 <!-- 适配android 7.0以及以上更新APK路径 --><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/provider_paths" /></provider>

添加权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

3.2,指定共享目录

在 src/main/res/xml下新建一个provider_paths.xml文件,然后加入以下代码:

<?xml version="1.0" encoding="utf-8"?>
<resources><paths><external-path path="" name="download"/></paths>
</resources>

如果xml文件夹不存在可以新建。

3.3,添加support.v4依赖

需要添加support.v4依赖,即引用android-support-v4.jar文件。注意这个jar文件的引用方式不能设置为 provided(compileOnly)。需要打包到aar文件中,否则程序启动时会报错找不到FileProvider类。

然后可以发布aar文件到unity中测试安装了。

我这边没有Android 7.0以下的手机,所以未能测试到Android 7.0以下的情况。

4,遇到的坑

  • provider_paths.xml 配置错误

  • 出现原因: support.v4引用错误或者为引用

Unity实现APK覆盖安装相关推荐

  1. 关于Unity打apk包安装到有虚拟按键的android机画布被压扁解决方案

    首先这个问题说白了就是一个设置问题,很简单,但是我却找了半天,百度了很久都没有找到解决方案.现在市面上的android机屏幕五花八门,很难将就.屏幕特性应接不暇,有时候适配起来让人很抓脑壳,什么滴水. ...

  2. Android使用adb安装和覆盖安装apk

    过程 配置环境变量,将上图所示完整地址加到环境变量path中 在命令输入adb install apk_path 例如:adb install xxx.apk 覆盖安装命令示例 adb install ...

  3. Unity导出apk出现的问题,JDK,Android SDK,NDK,无“安装模块”

    导出apk失败 使用unity导出apk文件,会出现提示:需要合适版本的JDK.Android SDK和Android NDK,要找到.下载和安装好合适的版本非常耗费时间, 网上很多教程指出可以直接在 ...

  4. Unity热更新系列之 大版本更新应用覆盖安装问题

    应用版本迭代有时候我们不得不进行大版本升级,让玩家下载最新的包进行覆盖安装掉原来的包,覆盖安装这个动作是操作系统处理的,所以我们要遵循系统规则才能以正确的姿势覆盖掉之前的应用包,这里面有些需要注意的点 ...

  5. android apk无法覆盖安装解决

    android apk包无法覆盖安装的原因有很多,比如包名问题.签名不一致问题.版本号问题等.在你不确定是什么原因的时候,你可能会一 一去尝试. 那么现在我就告诉你一种终极解决方案: 其实androi ...

  6. Android 设置apk之间不覆盖安装,7.0版本问题

    设置apk不覆盖安装,只需要修改build.gradle中的applicationId即可, 但是在安装7.0以上版本时, 需要把AndroidManifest.xml文件中关于7.0的私有目录配置中 ...

  7. 解决两个相同的APK安装失败,目的是不能覆盖安装原来的APP

    解决两个相同的APP包名和签名不一样但还是安装失败,目的是不能覆盖安装原来的APP **D:\yibo\TwosetsofremoteAPPsystems\this_yibo\htm_android\ ...

  8. 【备忘】Unity IOS 覆盖安装后进游戏黑屏

    情景: unity+LuaFrameWork_UGUI_V2,把资源打在包内用于过审,上架appStore后,覆盖安装下进游戏出现黑屏情况(上一版本是打小包过审,即大部分资源在进游戏后下载): 推测: ...

  9. Android 打包apk不能覆盖安装

    首先通过日志排查错误 发现是签名不一致问题 我是debug模式下安装release包不能覆盖 release包下可以覆盖安装 这时候配置一下就可以debug模式下的签名就可以了 https://www ...

最新文章

  1. Numpy中矩阵运算
  2. R语言ggplot2可视化并添加特定区间的回归线、R原生plot函数可视化并添加特定区间的回归线:Add Regression Line Between Certain Limits
  3. 【APIO2014】Palindromes
  4. curl模拟多线程抓取网页(优化)
  5. .NET防SQL注入方法
  6. 【机器学习】Apriori 算法进行关联分析和FP-growth算法
  7. l293d电机驱动原理_一文搞懂步进电机特性、原理及驱动器设计
  8. KVM中I/O设备直接分配和SR-IOV(十六)
  9. 怎样才有资格被称为开源软件
  10. mysql分库负载均衡_订单模块以及负载均衡和分库分表
  11. 记录部署hue在k8s上
  12. php的mcypt,php 7.3 在Centos6.x下的安装过程
  13. java sql异常_java.sql.SQLException: Io 异常: Got minus one from a
  14. 超级详细的手写webpack4配置来启动vue2项目(附配置作用)
  15. 正则表达式入门(c#)
  16. Python 之 单例
  17. 从写博文,看模块化思维的应用
  18. 快速启动工具入门——以Launchy为例(二)
  19. 标准串口定义-9转25的串口线接法图
  20. MQTT介绍,服务器(EMQ X)搭建,客户端(mqtt-spy,安卓)使用,java编程示例

热门文章

  1. 猫耳宝贝的个人资料以及猫耳宝贝的成名路
  2. JAVA读取excel表格中的数据,.xlsm文件或者.xlsx文件。
  3. 2017年复合材料与高分子科学工程国际会议(CMPSE2017)
  4. 看完300份作品集后,我想给求职的设计师们提点建议
  5. 电池3S和4S的区别,无人机原本是3S的电池,换成4S确实是可能造成参数不匹配
  6. Rails caching(Rails高速缓存)
  7. 提升固定资产管理效率,一招轻松制胜
  8. mysql raiserror_sql server数据库中raiserror函数的用法
  9. 科研写作-返修文章回复信模板
  10. linux怎么取消root加固,禁止Root从SSH直接访问加固Linux