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上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

a标签隐藏真实地址_家庭影院布线非常杂乱应该怎么补救?A/V电缆管理的7个技巧...

家庭影院应该是给人带来快乐的东西&#xff0c;不管是声音还是外观&#xff0c;但是如果您布的线很杂乱&#xff0c;那么想必整个影院也好看不到哪去&#xff0c;如果你想要整理的话&#xff0c;那么这篇文章应该能帮助到您。有没有整理过家庭影院的电线&#xff0c;观感是完全…

螺钉装弹垫平垫机器人_【经验总结】什么时候用平垫,什么时候用弹垫?

很多人为了节约成本想省了平垫或者弹垫&#xff0c;其实在螺栓使用过程中平垫和弹垫各自起着不可或缺的作用。今天咱们来针对平垫和弹垫给大家介绍一下。左 平 垫 右 弹 垫 平垫&#xff0c;形状一般是一个平垫圈&#xff0c;中间有一个孔&#xff0c;主要是用铁板冲压出来的&a…

生成FaceBook所需的散列哈希值

Hex to base64 converter FaceBook后台发布应用时&#xff0c;需要填入hash值&#xff0c;今天自己用openssl生成的时候只有24位并不正确&#xff0c;与其费劲巴拉的自己折腾openssl&#xff0c;还是感谢国外的大佬们吧&#xff0c;工具网址直接输入hex的sha1值*&#xff08;从…

打开方式中选择默认方式无反映_「Windows」得看,更改文件的默认应用,告别“打开方式”...

前言&#xff1a;你有没有在使用电脑过程中&#xff0c;打开各种各样格式的文件时&#xff0c;电脑有没有很准确的用你想用的那个软件将其打开&#xff1f;还是说你还在用“打开方式”手动选择你想使用的软件打开你想打开的这个文件。如何设置默认应用&#xff1a;步骤&#xf…

Z深度相关知识

渲染中深度信息很重要&#xff0c;但是也很让人迷惑&#xff0c;透视投影是什么&#xff0c;为什么要做透视除法&#xff0c;view空间&#xff0c;clip空间&#xff0c;ndc空间对应的z值又代表什么&#xff0c;这里简单总结下。 一.顶点变换的完整过程 二.View空间下的顶点和Z…

quartus管脚分配后需要保存吗_掉电保存数据到EEPROM

我想在掉电时保存数据(3 个字节)到 EEPROM 中&#xff0c;用 BOD掉电检测&#xff0c;不知怎样使用。望高手指点&#xff1a;1. 在 BOOT 区设置好 BODEN&#xff0c;BODLEVEL&#xff0c;后软件还要怎样设置&#xff1f;2. 掉电中断是否是产生复位&#xff1f;我的写 EEPROM 程…

matlab 最小二乘法拟合_计量与论文串讲:最小二乘法

点为什么要用R计量经济学作为经济大类下一门非常实用的学科有很强的实践意义。尽管内容庞杂但基本的指导思想却很简单&#xff0c;因此通过一门统计编程语言学习、掌握计量经济学有很大的益处。目前&#xff0c;市面上已经有多款统计编程语言和统计软件&#xff0c;实证分析领域…

ZoomBlur 聚焦模糊效果Shader(URP)

修改自这篇文章【Unity】UniversalRPでカスタムポストプロセスを作る【ZoomBlur】 - Qiita 1. VolumeEditor&#xff0c;用于在UnityVolume中控制自己写的后处理效果 using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal;[System.Seriali…

魅蓝s6启动android密码_魅蓝s6怎么恢复出厂设置?忘记密码怎么办

魅蓝s6怎么恢复出厂设置&#xff1f;忘记密码怎么办&#xff1f;手机是现代生活必不可少的工具之一&#xff0c;在使用时我们常常会忘记手机密码。本次就给大家介绍手机密码忘了怎么恢复出厂设置&#xff0c;快来看看吧。我们知道手机恢复出厂设置的注意事项最重要的就是做好手…

漫游飞行_魔兽世界:德拉诺时光周 冲声望解锁德拉诺飞行好时机

虽然德拉诺飞行开放已经是6.22版本的事情了&#xff0c;但是目前还是有些玩家还没有解锁。但是本周德拉诺时光周的开放&#xff0c;获取德拉诺飞行声望将会更加简单。德拉诺飞行声望德拉诺飞行解锁需要先知之手(部落是沃金之锋)、觉醒教派和刃牙追猎者三个声望达到崇敬。而在本…

python怎么解释语言_python是解释型语言吗

Python 是解释型的语言吗&#xff1f;它会被编译吗&#xff1f; 这个问题没有想象中那么好回答。和很多人认识世界一样&#xff0c;习惯以一个简单的模型去评判一些事物。而事实上&#xff0c;里面包含了很多很多的细节。通常的说法&#xff0c;编译代表着将一个高级语言转化为…

第一次失效_神兵小将:净化之力失效地魔兵兽,全靠特殊办法,铁心方式真霸气...

神兵小将&#xff1a;净化之力失效地魔兵兽&#xff0c;全靠特殊办法&#xff0c;铁心方式真霸气。在经典动漫神兵小将中&#xff0c;魔兵兽在漫迷眼中属于比较特殊的存在&#xff0c;很多人气指数超高的神兵兽被魔化后却成为阻碍问天前进的高山。因此魔兵兽在很大意义上讲也是…

Python 每日定时查询数据库生成Excel报表,并群发邮件

最近在做游戏打点数据的一些统计处理&#xff0c;写了个Python脚本完成每日定时自动查询生成Excel报表并群发邮件的小功能。 拆解几个需求点&#xff1a; 一.连接数据库并查询 以下是一个查询总注册人数的示例代码&#xff0c;host port db user password等填入自己数据库的…

com口驱动_Ubuntu 安装Nvidia显卡驱动指南

该文档适用于&#xff1a; Ubuntu 14/16/18 三个版本。Nvidia显卡驱动适用于&#xff1a;RTX2080TI/RTX2080/RTX2070/GTX1080TI/GTX1080/GTX1070以及更低级别显卡。本文档旨在帮助大家解决安装Nvidia显卡遇到的常见问题。Nvidia驱动下载地址&#xff1a;https://www.geforce.co…

Unity URP中根据深度重建世界坐标

通过深度值重建世界坐标&#xff0c;可以做出很多有意思的后处理效果&#xff0c;先实现下度值重建世界坐标这个功能。 一.验证重建效果 首先&#xff0c;得先找到一种证明反推回世界空间位置正确的方法。在相机前摆放几个物体&#xff0c;尽量使之在世界坐标下的位置小于1&a…

dubbo yml配置_Spring boot 的profile功能如何实现多环境配置自动切换

通常服务端应用开发需要经过以下几个流程&#xff1a;开发 -> 测试 -> RC验证 -> 上线这就涉及到四个不同的环境&#xff0c;开发环境、测试环境、RC环境以及生产环境&#xff0c;为了避免不同环境之间相互干扰&#xff0c;通常需要独立部署数据库、缓存服务器等&…

Unity中的SystemInfo.deviceUniqueIdentifier 唯一ID

做游戏时可能经常使用SystemInfo.deviceUniqueIdentifier作为用户的唯一ID进行注册登录&#xff0c; 但是你会发现从谷歌商店上下载的自己游戏&#xff0c;和自己从Unity工程中直接打包出来的游戏账号竟然是不一致的&#xff01; 这个坑还是很坑爹的&#xff0c;纠其原因是Sy…

sketchup生成面域插件_独家教程 | 快速抓取“高精准”场地信息,康石石教你生成不同“体量”地形...

无论建筑设计还是景观设计&#xff0c;同学们的设计项目都必须依托于场地来进行&#xff0c;通过分析场地的区位范围、地形地势&#xff0c;结合场地的局限性与可能性&#xff0c;才能进一步展开项目设计。可以说&#xff0c;获取场地信息是同学们在作品集创作中最重要的环节之…

Unity URP高度雾效果Shader

实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现&#xff08;LinearDepth&#xff0c;Reverse Z&#xff0c;世界坐标重建&#xff0c;软粒子&#xff0c;高度雾&#xff0c;运动模糊&#xff0c;扫描线效果&#xff09;_puppet_master的专栏-CSDN博客_shader深度…

无限重启_三星蓝光播放器出现无限自动重启BUG,涉及不少用户及不同型号

三星的蓝光播放器似乎遇到了一个挺严重的BUG&#xff0c;使得不少用户都开机后播放器会自动不停重启。从reddit、ZDNet以及三星技术支持论坛上面的情况来看&#xff0c;这次的问题波及不同型号的播放器&#xff0c;大部分用户遇到的问题都是不停重启。其中一位用户表示:“开机之…