cocoscreator3.X 强更 游戏内下载APK和安装APK

news2024/12/23 0:07:20

本文环境3.6.0,目测3.7, 3.8都可以用

强制更新是强制用户下载整包并覆盖安装,因为android部分代码不方便热更,所以游戏内采用服务器推送下载通知,游戏执行下载后再安装的形式.

下载完全可在ts层完成,可采用cocoscreator的native.Downloader类,此类功能非常强大,只要给出apk的服务器地址就可以执行下载操作,还返回onProgress(进度反馈)和onError和onSuccess回调,你可以方便的用一个进度条展示出下载进度,并获得下载失败的原因和成功回调,代码如下:

//下载Apk
    downloadApk() {
        if(!native || !native.AssetsManager ) {
            return;
        }
        let filePath = this._storagePath + "/bigwinner.apk"; //下载成功后的存放地址,为本地可写路径下的XX.apk

        if(!this._downloader)
            this._downloader = new native.Downloader();
        //下载失败回调
        this._downloader.onError = (task:native.DownloaderTask, errorCode: number, errorCodeInternal: number, errorStr: string)=> {
            console.log(errorStr);
        };

        //进度回调
        this._downloader.onProgress = (task, bytesReceived, totalBytesReceived, totalBytesExpected)=> {
            let progress:number = totalBytesReceived / totalBytesExpected; //已经下载的字节数 / 需要下载的总字节数
            this.getProgress(progress);
            let bKReceived:string = (totalBytesReceived / 1024).toFixed(1);
            let totalReceived:string = (totalBytesExpected / 1024).toFixed(1);
            var strProgress:string = "Download APK:" + bKReceived + "kb / " + totalReceived + "kb";
            this.updateLabel.string = strProgress;
        };
        //下载成功回调
        this._downloader.onSuccess = (task) => {
            this.updateLabel.string = "Download success!";
            this.installApk(filePath); //下载成功,执行安装apk操作
        };
        
        //开始执行下载操作,参数1:服务器的下载地址 如:http://192.168.0.101/game.apk  参数2:下载完成后的apk文件本地存放地址
        this._downloader.createDownloadTask(this.apkUrl, filePath);
    }

安装APK需要用到android底层,所以应该在android层写代码

ts层代码:

//安装APK
    installApk(apkPath:string) {
        if (native.reflection) {
            native.reflection.callStaticMethod("com/cocos/game/AppActivity", "installAPK", "(Ljava/lang/String;)V", apkPath);
        }
    }

此处调用com.cocos.game.AppActivity下的installApk静态方法

安卓代码:

//安装APK
    public static void installAPK(String path) {
        try {
            File apk = new File(path);
            if(!apk.exists()) {
                Log.e(TAG, "apk:" + path + " not found!");
                return;
            }
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            Uri uri;
            if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N) { //新版本android 24以后执行下面方法
                String packageName = myContext.getApplicationContext().getPackageName();//pkgName;
                String authority =  new StringBuilder(packageName).append(".fileprovider").toString();
                uri = FileProvider.getUriForFile(myContext, authority, apk);
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
            }
            else { //老版本执行下面方法
                uri = Uri.fromFile(apk);
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
            }
            myContext.startActivity(intent);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }

注意现在的android版本一般是大于android24的,即代码里的Build.VERSION_CODES.N,所以需要像代码里所写,在AndroidManfeist.xml里配置一个fileprovider,否则程序无法执行,具体是:

首先在AndroidManfiest文件里加入可安装的权限,以及读写内部存储的权限:

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

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

在<application></application>结点下添加一个provider配置,这个配置可放在所有的activity后面,如下:

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.goldenbulked.hyfbw.india.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true"
            >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

注意这里有两个要点,andrioid:authorities是"你的包名"+"fileprovider"写法,这是刚才installApk代码里写的,你可以再回头看一眼那个代码,还有那个meta-data里要配置可读写的路径,即 android:resource = "@xml/file_paths"里的配置,如果配置不对程序还是会报错的。
所以在res目录下新建个xml文件夹,在里面新建个file_paths.xml文件,如图所示:

file_paths.xml内容如下:
 

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path
        name="apk"
        path="bigwinner-remote-asset/" />
    <external-path
        name="app_update_external"
        path="/" />
    <external-cache-path
        name="app_update_cache"
        path="/" />
    <external-path
        name="camera_pictures"
        path="." />

    <external-path
        name="external"
        path="/" />
</paths>

其实也就第一条有用,我下载apk存放的路径是游戏可写路径下/bigwinner-remote-asset/内,这样配置游戏就能正常安装了

网上说需要动态申请安装和读取存储权限,我代码里面没有动态申请也能执行成功,安装时自动会问用户是否要安装,不知道那个动态申请代码有何用?

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

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

相关文章

继苹果、联发科后,传高通下一代5G芯片将由台积电以3纳米代工

台积电3纳米又有重量级客户加入。市场传出&#xff0c;继苹果、联发科之后&#xff0c;手机芯片大厂高通下一代5G旗舰芯片也将交由台积电以3纳米生产&#xff0c;最快将于10月下旬发表&#xff0c;成为台积电3纳米第三家客户。 针对相关传闻&#xff0c;至昨日&#xff08;25日…

基于SpringBoot的药房管理系统

基于SpringBootVue的药房管理系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员、用户 管理员&am…

共享门店模式:一种新兴的商业模式

共享门店模式是一种利用实体店铺的空间和资源&#xff0c;让多个品牌或商家在同一地点共同运营的商业模式。这种模式可以提高店铺的利用率&#xff0c;降低经营成本&#xff0c;增加客流量&#xff0c;实现资源的最大化利用。如果你是一个有创业想法的企业家&#xff0c;或者你…

Webshell 流量特征分析 (2)

前言&#xff1a;webshell是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境&#xff0c;主要用于网站管理、服务器管理、权限管理等操作。使用方法简单&#xff0c;只需上传一个代码文件&#xff0c;通过网址访问&#xff0c;便可进行很多日常操作&#xff0c;极…

华为OD七日集训第6期 十一特辑 - 按算法分类,由易到难,循序渐进,玩转OD

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

【ComfyUI】Pytorch预训练模型(torch.hub)缓存地址修改

序言 最近玩ComfyUI时&#xff0c;每次生成图片&#xff0c;总是会下载一些东西&#xff0c;时间长了&#xff0c;C盘就不够用了&#xff0c;今天清理C盘发现&#xff0c;总是会在C:\Users\yutao\.cache\torch\hub\checkpoints这个路径下&#xff0c;下载大模型文件&#xff0…

初级软件测试入门教程

一、软件测试的基本概念 1、软件测试的定义 就是以发现错误为目的而运行程序的过程。 软件测试员的目标是找到软件缺陷&#xff0c;尽可能早一些&#xff0c;并确保其得以修复。 2、软件测试方法总体分类 试图验证软件是“工作的”&#xff08;所谓“工作的”就是指软件的…

linux应用层静态链接和动态链接(.a .so)

1、介绍 即使一个非常简单的程序&#xff0c;也需要依赖C标准库和系统库&#xff0c;链接其实就是把其他第三方库和自己源代码生成的二进制目标文件融合在一起的过程。经过链接之后&#xff0c;那些第三方库中定义的函数就能被调用执行了。早期的一些操作系统一般使用静态链接…

代码随想录算法训练营第23期day7| 454.四数相加II 、383. 赎金信 、15. 三数之和、18. 四数之和

目录 一、&#xff08;leetode 454&#xff09;四数相加II 二、&#xff08;leetcode 383&#xff09;赎金信 暴力解法 哈希法 三、&#xff08;leetcode 15&#xff09;三数之和 四、&#xff08;leetcode 18&#xff09;四数之和 一、&#xff08;leetode 454&#xf…

git 分支管理进阶

1. merge 命令&#xff1a;git merge A 作用&#xff1a;把 A 分支 合并到当前分支 &#xff08;此时当前分支新增了一次提交&#xff0c;指着指向该提交&#xff09; 初始状态&#xff1a; git merge bugFix 后&#xff1a; 此外&#xff0c;如果再把 main 分支合并到 bug…

Unigram,Bigram,N-gram介绍

Unigram,Bigram&#xff0c;N-gram介绍 Unigram,Bigram&#xff0c;N-gram这三个概念&#xff0c;在学习自然语言的过程中大家可能会遇到。 Unigram,Bigram&#xff0c;N-gram在自然语言内容中的语言模型部分中大家可能会碰到。语言模型有很多种&#xff0c;在上一篇介绍一个…

三层交换机与防火墙对接上网如何配置

环境: 1.三层交换机 H3C S6520 version 7.1.070, Release 6530P02 2.防火墙 深信服 8.0.75 AF-2000-FH2130B-SC 问题描述: 三层交换机与防火墙对接上网如何配置 公司有多个部门且位于不同网段,各部门均有访问Internet的需求。现要求用户通过三层交换机和防火墙访问…

MySQL 事务的操作指南(事务篇 二)

基本操作 事务的提交方式&#xff1a;自动提交&#xff08;autocommit1&#xff09;和手动提交&#xff08;autocommit0&#xff09; 查询和修改事务提交方式&#xff1a; -- 查看事务提交方式(标识表示这是个系统变量) select autocommit ;-- 修改事务提交方式为自动提交 …

Zorin OS 16.3 发布:无缝升级和卓越改进

导读Zorin OS 团队自豪地宣布了备受期待的 Zorin OS 16.3 版本的发布&#xff0c;这是这个受欢迎的 Linux 发行版的一个里程碑版本。自首次发布以来不到两年时间&#xff0c;Zorin OS 已经获得了庞大的用户群体&#xff0c;截至目前已经有 530 万次下载&#xff0c;而 16.3 版本…

网工内推 | 网络工程师,熟悉H3C设备,有华三认证优先

01 苏州市蓝皓计算机科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、网络架构方案的规划、设计&#xff1b; 2、网络设备的配置以及网络环境的管理、配置、排错、维护&#xff1b; 3、网络项目的实施、协调、管理&#xff1b; 4、完成部门主管要求的各…

N 皇后问题

N 皇后问题研究的是如何将 N 个皇后放置在 N x N 的棋牌上&#xff0c;并且使皇后彼此之间不能相互攻击。 国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子 解决思路是&#xff1a;剪枝 回溯方法 解决问题 (1).使用二维数组创建棋牌格子 g…

Spring MVC 和 Spring Boot 的区别

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

连接组学中的机器学习:从表征学习到模型拟合

前言 机器学习(ML)由于其高自动化程度、高灵敏度和特异性优势&#xff0c;在医学影像领域取得了巨大的成功。由于具备这些优势&#xff0c;机器学习已被广泛应用于神经成像数据&#xff0c;目的是提取与感兴趣变量(如疾病状态)相关的特征。这使我们能够形成关于不同条件下大脑…

Python之xToolkit库

文章目录 一、xToolkit是什么&#xff1f;二、准备工作1.引入库2.导入数据 三、使用时间模块-xdatetime判断时间格式是否正确get方法获取时间戳获取年月日时分秒时间推移计算时间替换时间扩展两个时间的差值开始与结束时间时间是否在指定区间中 字符串模块-xstring字符串格式校…

前端任意修改地图风格颜色

在做地图相关应用时&#xff0c;常常遇到地图风格与UI界面不搭配的问题&#xff0c;如果在制图时就制作多种风格的地图&#xff0c;耗时耗力&#xff0c;超出成本控制。这里推荐一种快捷的方法&#xff0c;可在前端快速更改地图成任意风格&#xff0c;使色调与UI搭配。 先上一张…