Unity内实现Android APK版本更新
最近做项目有个需求是要Android应用内强更包体。Google一波直接选了一个android原生开源项目
GitHub - yangchong211/YCUpdateApp: 轻量级版本更新弹窗,弹窗上支持更新进度条,可以设置普通更新或者强制更新。解决8.0以上通知栏不显示问题,解决7.0以上安装apk异常,下载完成则会自动提示安装;下载异常,失败,错误等状态,支持重启下载任务;还支持自定义下载路径。代码量少,调用简单……
但是也是需要接入到Unity中,趟了一些小坑记录下实现步骤
步骤1
Unity接入插件,两种方式:
(1)mainTemplateGradle中直接引用,这种方式简单省事
implementation 'cn.yc:YCUpdateLib:1.1.0'
(2)下载源码后自己打出AAR文件给项目引用。这周种方式可以自定义修改内容,比如更新面板的样式,为了满足策划,我选择的是这种:
步骤2
引用该插件所需的依赖:在mainTemplateGradle中加入
api 'com.liulishuo.filedownloader:library:1.7.5'
这是一个坑,Github使用说明中并没有写这点,一直报错闪退,找了半天看源码才找到需要引用这么个东西
步骤3
写个Java调用更新的页面,我这写了个UpadateActivity,该Activity的唤起调用由MainActivity唤起
UpdateActivity:
package com.match.fruits;import android.Manifest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.ycbjie.ycupdatelib.*;public class UpdateActivity extends AppCompatActivity {//private static final String TAG = AppConst.TAG_PRE + "GameMainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);desc = getIntent().getStringExtra("Desc");url = getIntent().getStringExtra("Url");packageName = getIntent().getStringExtra("PackageName");//translucentActivity(this);UpdateAPK();}private String desc;private String url;private String packageName;private static final String apkName = "Game";// private static final String firstUrl = "https://xpchy-1301864052.cos.ap-beijing.myqcloud.com/fruitmatch/KuaiShou-0906-1.0.4(1).apk";private static final String[] mPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};public void UpdateAPK(){PermissionUtils.init(this);boolean granted = PermissionUtils.isGranted(mPermission);if(!granted){PermissionUtils permission = PermissionUtils.permission(mPermission);permission.callback(new PermissionUtils.SimpleCallback() {@Overridepublic void onGranted() {}@Overridepublic void onDenied() {PermissionUtils.openAppSettings();Toast.makeText(UpdateActivity.this,"请允许更新权限",Toast.LENGTH_SHORT).show();}});permission.request();}//设置自定义下载文件路径// AppUpdateUtils.APP_UPDATE_DOWN_APK_PATH = "apk" + File.separator + "downApk";UpdateFragment.showFragment(UpdateActivity.this,true, url, apkName, desc, packageName ,null);}}
MainActivity或其他总控代码中调用唤起强更功能的代码,该函数由Unity中触发:
public void UpdateAPK(String url, String desc, String packageName){Intent intent = new Intent(GameMainActivity.this, UpdateActivity.class);intent.putExtra("Desc", desc);intent.putExtra("Url", url);intent.putExtra("PackageName", packageName);startActivity(intent);}
步骤4
配置UpadteActivity:
为了该Activity透明能看到游戏背景(Unity主Activity),所以自己写了个Style,在Style.xml中加入:
<style name="AppFullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="android:windowNoTitle">true</item><item name="android:windowActionBar">false</item><item name="android:windowFullscreen">true</item><item name="android:windowContentOverlay">@null</item><item name="android:windowBackground">@android:color/transparent</item><item name="android:colorBackgroundCacheHint">@null</item><item name="android:windowIsTranslucent">true</item></style>
Androidmanifet中加入该Activity并引用Style的透明theme
注意一定要用的是Theme.AppCompt,否则会报错崩溃,参考以下解答:填坑
android - How to fix: "You need to use a Theme.AppCompat theme (or descendant) with this activity" - Stack Overflow
Android how to get AppCompat.Translucent type theme with support actionbar? - Stack Overflow
步骤5
填坑报错:Using WebView from more than one process at once with the same data directory is not supported
在主Application中加入(如果自己没自定义Application,那就放在总控代码里,反正核心是要设置webview)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {String processName = getProcessName(this);String packageName = this.getPackageName();if (!packageName.equals(processName)) {WebView.setDataDirectorySuffix(processName);}}private String getProcessName(Context context) {if (context == null) return null;ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {if (processInfo.pid == android.os.Process.myPid()) {return processInfo.processName;}}return null;}
问题参考以下解答:
Using WebView from more than one process at once with the same data directory is not supported_幻影浪子-CSDN博客
步骤6
写Unity代码,调用Java层中的UpdateAPK(String url, String desc, String packageName)函数实现更新包,Unity中C#代码:
public void UpdateAPK(string url, string desc, string packageName){AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("UpdateAPK", url, desc, packageName);}
步骤7
把aar和UpdateActivity等文件放到Unity中的Plugins/Android对应目录下,出包测试,接入成功
总结:坑还是挺多,得挨个趟坑,后续抽时间整理个Demo传到Github上
Unity内实现Android APK版本更新相关推荐
- Unity直接导出Android Apk包环境配置
关注公众号 风色年代(itfantasycc) 领 100G Unity 游戏开发资料 1.首先下载并安装安卓SDK和JDK: (1)安卓SDK下载地址(需要翻墙): https://develope ...
- unity安卓打包修改启动画面_Unity自动化打包Android APK
零. 前言 最近在做Unity开发,有个任务是通过Jenkins实现自动化打包Unity游戏成Android APK的需求,所以在完成任务后,梳理成了一个最简单的教学,也把遇到的坑和大家分享. 若需要 ...
- Android Apk签名修改V1,V2,V3,V4
Unity游戏打出 Android Apk 包,默认签名方式是V1,V2方式的. 但是九游要求只能用V1签名方式.那就对生成的 Andorid Apk包重新签名就OK了. 改签环境 改签 Androi ...
- android v3签名格式,Android Apk签名修改V1,V2,V3,V4
Unity游戏打出 Android Apk 包,默认签名方式是V1,V2方式的. 但是九游要求只能用V1签名方式.那就对生成的 Andorid Apk包重新签名就OK了. 改签环境 改签 Androi ...
- Unity教程之-Unity3d中针对Android Apk的签名验证(C#实现)
当Unity开发的游戏以Android Apk的形式发布之后,经常会遇到的一种情况就是别人对我们的游戏进行二次打包,也就是用他们的签名替换掉我们的签名,从而堂而皇之的将胜利果实占为己有.面对这样的情况 ...
- Android内置系统apk问题
平台:Rockchip android版本: 7.1 个人博客:https://www.letcos.top/ 1.问题描述 一款产品需要内置定制的launcher,使用了一些第三方的sdk.按系 ...
- Unity打包基于Android的apk环境搭建总结
Unity打包基于Android的apk环境搭建总结 资源准备 操作步骤 总结反馈 资源准备 配置Unity打包Android需要3大部分资源准备: 1.Unity准备 打开Unity,点击左上角Fi ...
- android apk 提取,android APK提取内置软件odex转dex
android APK提取内置软件odex转dex 细心的网友可能发现android的ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作 用呢? android123提示大 ...
- 【Android 12 AOSP学习】Android内置第三方apk到系统
这篇文章将介绍如何在Android系统中内置第三方apk 一.准备工作 编译好的Android源码 Android apk文件:也就是安卓应用安装包 二.步骤 (1)在源码packages/apps目 ...
最新文章
- Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片...
- windows7关闭计算机对话框,电脑弹出对话框很烦人怎么办?win7禁止对话框弹出的方法...
- PyTorch中AdaptiveAvgPool函数总结
- freamarker 模板中空格_高端商务公司介绍PPT模板
- 4.3Python数据处理篇之Matplotlib系列(三)---plt.plot()折线图
- 动态规划——最小路径和(Leetcode 64)
- 什么是python装饰器_深入理解 Python 装饰器
- Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句梳理
- k8s重要概念及部署k8s集群
- UE4开发游戏的流程
- 工作效率低,怎么办?
- 基于单片机的智能视力保护监控系统设计
- 将上线的网站的域名代理到本地
- 【Git】Conventional Commit 约定式提交规范
- 简单酷炫时尚设计开场视频模板剪辑素材
- 2.3.2 合并(拼接)字符串
- IT外企那点儿事--也说跳槽
- 对话线性资本郑灿:新一代AI公司的魅力与使命
- 学习—吴恩达《机器学习》—手敲代码_准备工作之基于Ubuntu系统的 Anaconda(python环境)搭建
- 信道化接收机matlab,基于FPGA的数字信道化接收机研究与实现
热门文章
- python编译器怎么运行不在路径中的py文件_对python当中不在本路径的py文件的引用详解...
- c调用c++ qt_【C/C++】qt库结构及示例
- java 的“mwq”_java的对象模型 - osc_mwqvsfzo的个人空间 - OSCHINA - 中文开源技术交流社区...
- java redis remove_最全的Java操作Redis的工具类
- mysql表导出csv空值_从mysql中导出csv格式的数据
- linux 删除乱码的文件夹,Linux服务器删除乱码文件和文件夹的方法
- python项目打包部署到ios_Python的iOS自动化打包实例代码
- 曼哈顿距离最小生成树
- (Z) Linux与BSD之间的10个不同之处
- 内存分配方式以及堆和栈的区别