app分发平台java_集成 Asset Delivery (Java)
您可以按照本指南中的步驟,從 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 的條目。
后續步驟
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的app分发平台java_集成 Asset Delivery (Java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡被盗刷怎么办 要及时冻结避免损失
- 下一篇: 符号未定义Java_Java ODBC数