您可以按照本指南中的步骤,从 Java 代码获取应用的资源包。如果您尚未使用 Asset Pack 构建 app bundle,请参阅针对原生代码或 Java 代码构建后再继续。

概览

Play Core Java API 提供了用于请求资源包、管理下载内容和获取资源的 AssetPackManager 类。根据您希望获取的 Asset Pack 的分发类型实现该 API。这些步骤如以下流程图所示。

注意:用于获取 install-time Asset Pack 的 API 与用于获取 fast-follow 和 on-demand Asset Pack 的 API 不同。

图 1. 获取 Asset Pack 的流程图

安装时分发

配置为 install-time 的资源包可以在应用启动后立即使用。使用 Java AssetManager API 获取在此模式下提供的资产:

import android.content.res.AssetManager;

...

Context context = createPackageContext("com.example.app", 0);

AssetManager assetManager = context.getAssets();

InputStream is = assetManager.open("asset-name");

快速跟进式分发和按需分发

以下几部分介绍了如何在下载 Asset Pack 前获取其相关信息、如何调用 API 以开始下载,以及之后如何获取已下载的 Asset Pack。这几部分适用于 fast-follow 和 on-demand Asset Pack。

查看状态

每个资源包都存储于应用的内部存储空间内单独的文件夹中。使用 getPackLocation() 方法确定 Asset Pack 的根文件夹。此方法会返回以下值:

返回值

状态

null

未知 Asset Pack 或资产无法使用

注意:请勿依赖在两次应用启动之间的间隔时间内缓存的 Asset Pack 位置。应用应在每次启动时始终检查是否存在 Asset Pack。Asset Pack 可能会因应用更新或用户清除应用数据而变为无效。

获取有关资源包的下载信息

在提取资源包之前,应用必须披露下载内容的大小。使用 getPackStates() 方法确定下载内容的大小,以及资源包是否已在下载。

Task getPackStates(List packNames)

getPackStates() 是用于返回任务的异步方法。该任务的结果包含一个 AssetPackStates 对象。AssetPackStates 对象的 packStates() 方法会返回一个 Map

AssetPackState>。此映射包含所请求的每个 Asset Pack 的状态,按其名称进行键控:

Map AssetPackStates#packStates()

最终请求如下所示:

final String assetPackName = "myasset";

assetPackManager

.getPackStates(Collections.singletonList(assetPackName))

.addOnCompleteListener(new OnCompleteListener() {

@Override

public void onComplete(Task task) {

AssetPackStates assetPackStates;

try {

assetPackStates = task.getResult();

AssetPackState assetPackState =

assetPackStates.packStates().get(assetPackName);

} catch (RuntimeExecutionException e) {

Log.d("MainActivity", e.getMessage());

return;

})

以下 AssetPackState 方法提供了资源包的大小、截至目前已下载的数据量(如已请求),以及已传输到应用的数据量:

如需获取资源包的状态,请使用 status() 方法,该方法以整数形式返回与 AssetPackStatus 类中某个常量字段相对应的状态。尚未安装的资源包状态为 AssetPackStatus.NOT_INSTALLED。

如果请求失败,请使用 errorCode() 方法,该方法的返回值与 AssetPackErrorCode 类中的某个常量字段相对应。

安装

使用 fetch() 方法首次下载资源包,或要求进行资源包更新以完成操作:

Task fetch(List packNames)

此方法会返回一个 AssetPackStates 对象,其中包含资源包列表及其初始下载状态和大小。如果通过 fetch() 请求的 Asset Pack 已经在下载,就会返回下载状态,并且不会启动其他下载。

注意:在大多数情况下,您需要实现 listener 以跟踪下载和安装过程,如下一部分所述。

监控下载状态

您应实现 listener 以跟踪 Asset Pack 的安装进度。状态更新按 Asset Pack 细分,以支持跟踪各 Asset Pack 的状态。在请求的所有其他下载完成之前,您就可以开始使用已可供使用的资源包。

void

registerListener(AssetPackStateUpdatedListener

listener)

void

unregisterListener(AssetPackStateUpdatedListener listener)

注意:在用户安装或更新应用后,Play 商店会自动触发下载任何 fast-follow 资源包。不过,这些资源包可能无法立即供用户使用。您必须在每次应用启动时检查 fast-follow Asset Pack 的状态。如果下载正在进行,请使用监听器对其进行监控。如果下载已取消或暂停,您可以使用 fetch() 方法恢复下载,如安装部分所述。

下载内容较大

如果下载内容超过 150 MB 并且用户未连接到 WLAN,那么在用户明确同意使用移动网络连接继续下载前,下载不会开始。同样,如果下载内容较大并且用户与 WLAN 的连接断开,下载会暂停,需要用户明确同意才能使用移动网络连接继续下载。已暂停的 Asset Pack 状态为 WAITING_FOR_WIFI。如需触发界面流程以提示用户同意,请使用 showCellularDataConfirmation() 方法。

请注意,如果应用不调用此方法,下载会暂停,并且只有当用户重新连接到 WLAN 时才会自动恢复下载。

以下是监听器的一个实现示例:

assetPackStateUpdateListener = new AssetPackStateUpdateListener() {

@Override

public void onStateUpdate(AssetPackState assetPackState) {

switch (assetPackState.status()) {

case AssetPackStatus.PENDING:

Log.i(TAG, "Pending");

break;

case AssetPackStatus.DOWNLOADING:

long downloaded = assetPackState.bytesDownloaded();

long totalSize = assetPackState.totalBytesToDownload();

double percent = 100.0 * downloaded / totalSize;

Log.i(TAG, "PercentDone=" + String.format("%.2f", percent));

break;

case AssetPackStatus.TRANSFERRING:

// 100% downloaded and assets are being transferred.

// Notify user to wait until transfer is complete.

break;

case AssetPackStatus.COMPLETED:

// Asset pack is ready to use. Start the game.

break;

case AssetPackStatus.FAILED:

// Request failed. Notify user.

Log.e(TAG, assetPackState.errorCode());

break;

case AssetPackStatus.CANCELED:

// Request canceled. Notify user.

break;

case AssetPackStatus.WAITING_FOR_WIFI:

if (!waitForWifiConfirmationShown) {

assetPackManager.showCellularDataConfirmation(MainActivity.this)

.addOnSuccessListener(new OnSuccessListener () {

@Override

public void onSuccess(Integer resultCode) {

if (resultCode == RESULT_OK) {

Log.d(TAG, "Confirmation dialog has been accepted.");

} else if (resultCode == RESULT_CANCELED) {

Log.d(TAG, "Confirmation dialog has been denied by the user.");

}

}

});

waitForWifiConfirmationShown = true;

}

break;

case AssetPackStatus.NOT_INSTALLED:

// Asset pack is not downloaded yet.

break;

}

}

}

或者,您也可以使用 getPackStates() 方法获取当前下载的状态。AssetPackStates 包含下载进度、下载状态和任何失败的错误代码。

获取资源包

在下载请求达到 COMPLETED 状态后,您可以使用文件系统调用获取资源包。使用 getPackLocation() 方法获取资源包的根文件夹。

资源存储于资源包根目录内的 assets 目录下。您可以使用便捷方法 assetsPath() 获取 assets 目录的路径。请使用以下方法获取特定资产的路径:

private String getAbsoluteAssetPath(String assetPack, String relativeAssetPath) {

AssetPackLocation assetPackPath = assetPackManager.getPackLocation(assetPack);

if (assetPackPath == null) {

// asset pack is not ready

return null;

}

String assetsFolderPath = assetPackPath.assetsPath();

// equivalent to: FilenameUtils.concat(assetPackPath.path(), "assets");

String assetPath = FilenameUtils.concat(assetsFolderPath, relativeAssetPath);

return assetPath;

}

其他 Play Core API 方法

以下是您可能希望在应用中使用的一些其他 API 方法。

取消请求

使用 cancel() 取消有效的资源包请求。请注意,此请求是尽力而为的操作。

移除资源包

获取多个资源包的位置

使用 getPackLocations() 批量查询多个资源包的状态,此方法将返回资源包与其位置的映射。getPackLocations() 返回的映射包含当前已下载且为最新状态的每个 Asset Pack 的条目。

后续步骤

app分发平台java_集成 Asset Delivery (Java)相关推荐

  1. 【得物技术】得物App分发平台的探索建设历程

    前言 随着公司的快速发展,团队规模也随之扩大,测试包的高效分发成为一个痛点.为解决这一痛点,提高团队的整体迭代效率,落实技术部『效率』关键词,我们立项了建设得物App分发平台项目.下面,我带领大家一起 ...

  2. 如何搭建APP分发平台分发平台搭建教程

    如何搭建APP分发平台分发平台搭建教程 大家好我是艾西今天跟大家聊聊什么是分发平台,分发平台怎么搭建. 什么是App分发平台?其实App分发平台就是当你的软件做好了之后,你需要一个平台把你的安装包上传 ...

  3. 自行搭建app分发平台

    以前开发的app,多通过蒲公英进行内测,小范围试用.蒲公英提供了每天免费1000次下载量,这个数量绰绰有余.但是前段时间蒲公英修改了政策,专注做内测,不做分发,每个应用同一版本只能有100下载量,且还 ...

  4. 在线IOS免签封包App分发平台源码ios+安卓分发源码/应用托管

    正文: 分享app在线IOS免签封包仿fir二开分发平台, 一键IOS免签,支持在线封装app分发源码. 安装说明: 安装环境:php7.0 ,mysql5.6,nginx,php7.0设置里,设置最 ...

  5. app分发平台ipa文件提取方法

    今天有位朋友问我怎么提取分发平台的ipa文件.想反编译文件 其实步骤很简单. 浏览器 按F12 切换 手机访问,然后把设备切换成苹果.选择Network,然后点击下载 复制plist文件地址,将文件下 ...

  6. fir.im同款企业级APP分发平台系统源码

    介绍: 1.本源码跟fir.im网站同款,演示站直接看这个网站就好了https://fir.im/  2.后台可设置下载次数,自己搭建自给自足  3.服务器带宽不够的小伙伴也不用担心,可对接各大云存储 ...

  7. 详解APP应用分发平台的榜单推荐和搜索排名规则

    如果你要问最近互联网最热门话题的是什么?那一定是App的应用与营销推广了.APP是英文Application的简称,由于iPhone等智能手机的流行,APP指智能手机的第三方应用程序.一开始APP只是 ...

  8. 网站转APP软件封装网页转APP打包H5封装分发平台APP封装生成双端

    APP封装 什么是 APP 封装? 什么是APP打包 其实APP打包.APP封装.在线打包 都是一个意思,就是把网站封装成APP 1.APP 封装是指把网页形式的网站通过技术封装成为可以下载 到手机上 ...

  9. 不同分发平台的区别和特点

    当一款APP开发完成后,接下来就是分发了,常见的#APP分发#平台,安卓有应用宝.百度手机助手.360.华为.小米.魅族.酷安等,苹果只有App Store这一个应用商店. 但是,这些分发渠道都有一定 ...

最新文章

  1. Hyper-v Server重复数据删除技术
  2. dbc2000找不到服务器控制台,控制面板没有BDE Administrator(安装好DBC2000找不到)
  3. 登录之图形跟短信验证码
  4. 生命周期 用户可以操作dom_React 生命周期的打怪升级之路
  5. laravel CURD
  6. 为什么有人说开车时,最能看出一个人的情商和潜力?
  7. I - Arbitrage(判断是否有无正环 II)
  8. 记录——《C Primer Plus (第五版)》第十章编程练习第九题
  9. CNDS 签到在哪里
  10. 一键hosts修改工具 全百科Hosts修改器
  11. SSO —— 单点登录CAS与OAuth2
  12. composer 安装laravel
  13. 公司java项目上线生产环境发布流程
  14. Windows XP支持的最大内存是多少?
  15. 写给程序员的心理学入门知识(一)
  16. 大学生计算机基础学多久,大学生计算机基础学期总结
  17. Word打开docx文件报错
  18. C-lodop打印控件 实现批量打印
  19. 注册小程序需要营业执照吗?
  20. mysql事务排队情况_MySQL事务问题

热门文章

  1. Oracle原理:11g中的网络配置
  2. 遗传算法求二元函数极值怎么编码_遗传算法求解一元函数二元函数最值
  3. 文件系统_Docker文件系统实战
  4. 无法加入nacos服务列表_Nacos 1.1.1 发布,支持灰度配置和地址服务器模式
  5. 台式电脑不拉网线上网_技巧知识:电脑不用网线也可以上网了,你知道吗?
  6. NLP(二十二)使用LSTM进行语言建模以预测最优词
  7. Oracle索引知识学习笔记
  8. PHP二维数组去重(指定键名)
  9. [SDOI2009]HH去散步(矩阵)
  10. 不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接。中断与此服务器或共享资源的连接,然后在试一次...