Segui i passaggi di questa guida per accedere ai pacchetti di asset della tua app dal tuo Java le API nel tuo codice.
Sviluppa per Kotlin e Java
Segui questi passaggi per integrare Play Asset Delivery nel sistema Android del tuo progetto App Bundle. Non è necessario utilizzare Android Studio per eseguire questi passaggi.
Aggiorna la versione del plug-in Android per Gradle nel pannello
build.gradle
file su4.0.0
o versioni successive.Nella directory di primo livello del progetto, crea una directory per l'asset . Il nome della directory viene utilizzato come nome del pacchetto di asset. Nomi pacchetti di asset deve iniziare con una lettera e può contenere solo lettere, numeri e trattini bassi.
Nella directory del pacchetto di asset, crea un file
build.gradle
e aggiungi il seguire il codice. Assicurati di specificare il nome del pacchetto di asset e solo uno tipo di consegna:Alla moda
// In the asset pack's build.gradle file: plugins { id 'com.android.asset-pack' } assetPack { packName = "asset-pack-name" // Directory name for the asset pack dynamicDelivery { deliveryType = "[ install-time | fast-follow | on-demand ]" } }
Kotlin
// In the asset pack's build.gradle.kts file: plugins { id("com.android.asset-pack") } assetPack { packName.set("asset-pack-name") // Directory name for the asset pack dynamicDelivery { deliveryType.set("[ install-time | fast-follow | on-demand ]") } }
Nel file
build.gradle
dell'app del progetto, aggiungi il nome di ogni pacchetto di asset nel tuo progetto, come mostrato di seguito:Alla moda
// In the app build.gradle file: android { ... assetPacks = [":asset-pack-name", ":asset-pack2-name"] }
Kotlin
// In the app build.gradle.kts file: android { ... assetPacks += listOf(":asset-pack-name", ":asset-pack2-name") }
Nel file
settings.gradle
del progetto, includi tutti i pacchetti di asset nel tuo progetto come mostrato di seguito:Alla moda
// In the settings.gradle file: include ':app' include ':asset-pack-name' include ':asset-pack2-name'
Kotlin
// In the settings.gradle.kts file: include(":app") include(":asset-pack-name") include(":asset-pack2-name")
Nella directory del pacchetto di asset, crea la seguente sottodirectory:
src/main/assets
.Posiziona gli asset nella directory
src/main/assets
. Puoi creare anche le sottodirectory. La struttura della directory per l'app deve ora hanno il seguente aspetto:build.gradle
settings.gradle
app/
asset-pack-name/build.gradle
asset-pack-name/src/main/assets/your-asset-directories
Crea l'Android App Bundle con Gradle. Nell'app bundle generato, la directory a livello di directory principale ora include seguenti:
asset-pack-name/manifest/AndroidManifest.xml
: Configura l'identificatore e la modalità di invio del pacchetto di assetasset-pack-name/assets/your-asset-directories
: Directory che contiene tutti gli asset pubblicati nell'ambito del pacchetto di asset
Gradle genera il manifest per ogni pacchetto di asset e restituisce
assets/
la directory di Google Cloud.(Facoltativo) Includi la Raccolta di asset di Google Play se prevedi di utilizzare la pubblicazione rapida e on demand
Alla moda
implementation "com.google.android.play:asset-delivery:2.2.2" // For Kotlin use asset-delivery-ktx implementation "com.google.android.play:asset-delivery-ktx:2.2.2"
Kotlin
implementation("com.google.android.play:asset-delivery:2.2.2") // For Kotlin use core-ktx implementation("com.google.android.play:asset-delivery-ktx:2.2.2")
(Facoltativo) Configura l'app bundle in modo che supporti una texture diversa formati di compressione.
Integrazione con l'API Play Asset Delivery
L'API Play Asset Delivery Java
fornisce
AssetPackManager
:
per richiedere i pacchetti di asset, gestire i download e accedere agli asset. Assicurati prima di aggiungere la Raccolta di asset di Google Play al tuo progetto.
Implementi questa API in base al tipo di pubblicazione del pacchetto di asset che vuoi per accedere. Questi passaggi sono mostrati nel diagramma di flusso seguente.
Figura 1. Diagramma di flusso per l'accesso ai pacchetti di asset
Consegna al momento dell'installazione
I pacchetti di asset configurati come install-time
sono immediatamente disponibili nell'app
avviare l'applicazione. Utilizza il linguaggio Java
API AssetManager per accedere agli asset
pubblicato in questa modalità:
Kotlin
import android.content.res.AssetManager ... val context: Context = createPackageContext("com.example.app", 0) val assetManager: AssetManager = context.assets val stream: InputStream = assetManager.open("asset-name")
Java
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("asset-name");
Consegna rapida successiva e on demand
Le seguenti sezioni mostrano come ottenere informazioni sui pacchetti di asset prima
scaricarle, come chiamare l'API per avviare il download e come
per accedere ai pacchetti scaricati. Queste sezioni si applicano a fast-follow
e
on-demand
pacchetti di asset.
Verifica lo stato
Ogni pacchetto di asset viene archiviato in una cartella separata nella memoria interna dell'app.
Utilizza la
getPackLocation()
per determinare la cartella principale di un pacchetto di asset. Questo metodo restituisce
i seguenti valori:
Valore restituito | Stato |
---|---|
Un oggetto AssetPackLocation valido |
La cartella principale del pacchetto di asset è pronta per l'accesso immediato all'indirizzo assetsPath() |
null |
Pacchetto di asset sconosciuto o asset non disponibili |
Ricevere informazioni per il download sui pacchetti di asset
Le app devono indicare le dimensioni del download prima di recuperare l'asset
. Utilizza la
requestPackStates()
o getPackStates()
per determinare le dimensioni del download e se il pacchetto è già
download.
Kotlin
suspend fun requestPackStates(packNames: List<String>): AssetPackStates
Java
Task<AssetPackStates> getPackStates(List<String> packNames)
requestPackStates()
è una funzione di sospensione che restituisce un
AssetPackStates
mentre getPackStates()
è un metodo asincrono che restituisce un Task<AssetPackStates>
. La
packStates()
di un oggetto AssetPackStates
restituisce Map<String,
AssetPackState>
. Questa mappa contiene lo stato di ogni asset richiesto
pacchetto, abbreviato in base al nome:
Kotlin
AssetPackStates#packStates(): Map<String, AssetPackState>
Java
Map<String, AssetPackState> AssetPackStates#packStates()
La richiesta finale viene visualizzata da quanto segue:
Kotlin
const val assetPackName = "assetPackName" coroutineScope.launch { try { val assetPackStates: AssetPackStates = manager.requestPackStates(listOf(assetPackName)) val assetPackState: AssetPackState = assetPackStates.packStates()[assetPackName] } catch (e: RuntimeExecutionException) { Log.d("MainActivity", e.message) } }
Java
final String assetPackName = "myasset"; assetPackManager .getPackStates(Collections.singletonList(assetPackName)) .addOnCompleteListener(new OnCompleteListener<AssetPackStates>() { @Override public void onComplete(Task<AssetPackStates> task) { AssetPackStates assetPackStates; try { assetPackStates = task.getResult(); AssetPackState assetPackState = assetPackStates.packStates().get(assetPackName); } catch (RuntimeExecutionException e) { Log.d("MainActivity", e.getMessage()); return; })
Le seguenti
AssetPackState
forniscono le dimensioni del pacchetto di asset, la quantità scaricata finora (se
richiesto) e l'importo già trasferito all'app:
Per ottenere lo stato di un pacchetto di asset, utilizza il metodo
status()
, che restituisce lo stato come un numero intero che corrisponde a una costante
nel campo
AssetPackStatus
. Lo stato di un pacchetto di asset non ancora installato è
AssetPackStatus.NOT_INSTALLED
.
Se una richiesta non va a buon fine, utilizza
errorCode()
il cui valore restituito corrisponde a un campo costante nella
AssetPackErrorCode
.
Installa
Utilizza il requestFetch()
o
fetch()
per scaricare un pacchetto di asset per la prima volta o chiamare l'aggiornamento di un
pacchetto di asset da completare:
Kotlin
suspend fun AssetPackManager.requestFetch(packs: List<String>): AssetPackStates
Java
Task<AssetPackStates> fetch(List<String> packNames)
Questo metodo restituisce un
AssetPackStates
contenente un elenco di pacchetti e le relative dimensioni e stati di download iniziali.
Se è già in corso il download di un pacchetto di asset richiesto tramite requestFetch()
o fetch()
, il download
e non viene avviato alcun download aggiuntivo.
Monitora gli stati di download
Dovresti implementare
AssetPackStateUpdatedListener
monitorare l'avanzamento dell'installazione dell'asset
. Gli aggiornamenti dello stato sono suddivisi per pacchetto per consentire il monitoraggio
dei singoli pacchetti di asset. Puoi iniziare a utilizzare i pacchetti di asset disponibili
prima del completamento di tutti gli altri download
per la tua richiesta.
Kotlin
fun registerListener(listener: AssetPackStateUpdatedListener) fun unregisterListener(listener: AssetPackStateUpdatedListener)
Java
void registerListener(AssetPackStateUpdatedListener listener) void unregisterListener(AssetPackStateUpdatedListener listener)
Download di grandi dimensioni
Se il download supera i 200 MB e l'utente non è connesso a una rete Wi-Fi,
non inizia finché l'utente non dà il proprio consenso esplicito per procedere con
eseguire il download utilizzando una connessione dati mobili. Analogamente, se il download è di grandi dimensioni
l'utente perde la connessione Wi-Fi, il download viene sospeso ed è necessario il consenso esplicito per
continuare utilizzando una connessione dati mobili. Un pacchetto in pausa ha uno stato
WAITING_FOR_WIFI
. Per attivare il flusso dell'interfaccia utente per richiedere il consenso all'utente, utilizza
showConfirmationDialog()
.
Tieni presente che se l'app non chiama questo metodo, il download viene sospeso e automaticamente solo quando l'utente è di nuovo connesso al Wi-Fi.
Conferma utente richiesta
Se lo stato di un pacchetto è REQUIRES_USER_CONFIRMATION
, il download non
continuare finché l'utente non accetta la finestra di dialogo mostrata con
showConfirmationDialog()
Questo stato può verificarsi quando l'app non viene riconosciuta da Play, ad esempio se
l'app è stata trasferita tramite sideload.
Tieni presente che le chiamate
showConfirmationDialog()
in questo caso l'app verrà aggiornata. Dopo l'aggiornamento, dovrai
per richiedere nuovamente gli asset.
Di seguito è riportato un esempio di implementazione di un listener:
Kotlin
private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult() ) { result -> if (result.resultCode == RESULT_OK) { Log.d(TAG, "Confirmation dialog has been accepted.") } else if (result.resultCode == RESULT_CANCELED) { Log.d(TAG, "Confirmation dialog has been denied by the user.") } } assetPackManager.registerListener { assetPackState -> when(assetPackState.status()) { AssetPackStatus.PENDING -> { Log.i(TAG, "Pending") } AssetPackStatus.DOWNLOADING -> { val downloaded = assetPackState.bytesDownloaded() val totalSize = assetPackState.totalBytesToDownload() val percent = 100.0 * downloaded / totalSize Log.i(TAG, "PercentDone=" + String.format("%.2f", percent)) } AssetPackStatus.TRANSFERRING -> { // 100% downloaded and assets are being transferred. // Notify user to wait until transfer is complete. } AssetPackStatus.COMPLETED -> { // Asset pack is ready to use. Start the game. } AssetPackStatus.FAILED -> { // Request failed. Notify user. Log.e(TAG, assetPackState.errorCode()) } AssetPackStatus.CANCELED -> { // Request canceled. Notify user. } AssetPackStatus.WAITING_FOR_WIFI, AssetPackStatus.REQUIRES_USER_CONFIRMATION -> { if (!confirmationDialogShown) { assetPackManager.showConfirmationDialog(activityResultLauncher); confirmationDialogShown = true } } AssetPackStatus.NOT_INSTALLED -> { // Asset pack is not downloaded yet. } AssetPackStatus.UNKNOWN -> { Log.wtf(TAG, "Asset pack status unknown") } } }
Java
assetPackStateUpdateListener = new AssetPackStateUpdateListener() { private final ActivityResultLauncher<IntentSenderRequest> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == RESULT_OK) { Log.d(TAG, "Confirmation dialog has been accepted."); } else if (result.getResultCode() == RESULT_CANCELED) { Log.d(TAG, "Confirmation dialog has been denied by the user."); } } }); @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: case AssetPackStatus.REQUIRES_USER_CONFIRMATION: if (!confirmationDialogShown) { assetPackManager.showConfirmationDialog(activityResultLauncher); confirmationDialogShown = true; } break; case AssetPackStatus.NOT_INSTALLED: // Asset pack is not downloaded yet. break; case AssetPackStatus.UNKNOWN: Log.wtf(TAG, "Asset pack status unknown") break; } } }
In alternativa, puoi utilizzare
getPackStates()
per ottenere lo stato dei download correnti.
AssetPackStates
contiene l'avanzamento del download, lo stato del download ed eventuali codici di errore.
Accedi ai pacchetti di asset
Puoi accedere a un pacchetto di asset tramite chiamate al file system dopo la richiesta di download
raggiunge
COMPLETED
stato. Utilizza la
getPackLocation()
per ottenere la cartella principale del pacchetto di asset.
Gli asset vengono archiviati nella directory assets
all'interno della directory radice del pacchetto di asset
. Puoi ottenere il percorso della directory assets
utilizzando il comando
metodo di convenienza
assetsPath()
Utilizza il seguente metodo per recuperare il percorso di un asset specifico:
Kotlin
private fun getAbsoluteAssetPath(assetPack: String, relativeAssetPath: String): String? { val assetPackPath: AssetPackLocation = assetPackManager.getPackLocation(assetPack) // asset pack is not ready ?: return null val assetsFolderPath = assetPackPath.assetsPath() // equivalent to: FilenameUtils.concat(assetPackPath.path(), "assets") return FilenameUtils.concat(assetsFolderPath, relativeAssetPath) }
Java
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; }
Altri metodi dell'API Play Asset Delivery
Di seguito sono riportati alcuni metodi dell'API aggiuntivi che puoi utilizzare nella tua app.
Annulla richiesta
Utilizza le funzionalità di
cancel()
per annullare una richiesta di pacchetto di asset attiva. Tieni presente che questa richiesta è il criterio del "best effort"
operativa.
Rimuovere un pacchetto di asset
Utilizza le funzionalità di
requestRemovePack()
o
removePack()
per pianificare la rimozione di un pacchetto di asset.
Recupera le posizioni di più pacchetti di asset
Utilizza le funzionalità di
getPackLocations()
per eseguire una query sullo stato di più pacchetti di asset in blocco, il che restituisce una mappa
pacchetti di asset e le relative posizioni. La mappa restituita da getPackLocations()
contiene una voce per ogni pacchetto attualmente scaricato e aggiornato.
Passaggio successivo
Testare Play Asset Delivery in locale e da su Google Play.