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

本文环境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/内,这样配置游戏就能正常安装了

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
cocos creator打包APK的过程可以分为以下几个步骤: 1. 配置环境:首先需要安装Android Studio,并按照cocos官方文档的指引进行配置。具体的配置步骤可以参考官方文档(\[2\])。 2. cocos构建发布:在cocos creator中,选择构建发布选项,然后选择Android平台。在构建设置中,可以设置一些参数,如包名、签名等。根据项目的需求进行相应的设置。 3. 打包APK:根据官方文档的提示,使用Android Studio打开构建生成的工程文件(一般位于项目目录下的`build/jsb-default/frameworks/runtime-src/proj.android-studio`)。在Android Studio中,选择Build菜单下的Build Bundle(s) / APK(s)选项,即可开始打包APK的过程。 在打包过程中,可能会遇到一些SDK版本的问题,特别是对于对原生Android开发不熟悉的人来说。如果遇到问题,可以参考官方文档或者在评论区提问,寻求帮助(\[1\])。 #### 引用[.reference_title] - *1* *2* [cocos creator 3.x打包构建原生安卓APK流程(打包release版本,修改APP图标)](https://blog.csdn.net/hangsky1990/article/details/131740544)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [cocos creator 打包原生安卓apk 构建与编译](https://blog.csdn.net/qq_41506812/article/details/118069337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天马流星2719

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值