Java'nızdan uygulamanızın öğe paketlerine erişmek için bu kılavuzdaki adımları uygulayın girin.
Kotlin ve Java için uygulama geliştirme
Play Asset Delivery'yi projenizin Android'ine eklemek için aşağıdaki adımları uygulayın App Bundle'ı seçin. Bu adımları uygulamak için Android Studio'yu kullanmanız gerekmez.
Projenizde Android Gradle eklentisinin sürümünü güncelleyin.
build.gradle
dosyasını4.0.0
veya sonraki bir dosyaya gönderin.Projenizin üst düzey dizininde, öğe için bir dizin oluşturun yükleyin. Bu dizin adı, öğe paketi adı olarak kullanılır. Öğe paketi adları bir harfle başlamalıdır ve yalnızca harf, rakam ve alt çizgi.
Öğe paketi dizininde, bir
build.gradle
dosyası oluşturun ve aşağıdaki kodu kullanabilirsiniz. Öğe paketinin adını ve yalnızca bir yayınlama türünü belirttiğinizden emin olun:Eski
// 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 ]") } }
Projenin uygulama
build.gradle
dosyasına, projenizdeki her öğe paketinin adını aşağıdaki gibi ekleyin:Eski
// 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") }
Projenin
settings.gradle
dosyasına, proje aşağıda gösterildiği gibidir:Eski
// 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")
Öğe paketi dizininde aşağıdaki alt dizini oluşturun:
src/main/assets
Öğeleri
src/main/assets
dizinine yerleştirin. Burada da alt dizinler oluşturabilirsiniz. Uygulamanızın dizin yapısı şu şekilde görünmelidir:build.gradle
settings.gradle
app/
asset-pack-name/build.gradle
asset-pack-name/src/main/assets/your-asset-directories
Gradle ile Android App Bundle'ı oluşturun. Oluşturulan uygulama paketinde, kök düzey dizin artık takip etmek için:
asset-pack-name/manifest/AndroidManifest.xml
: Öğe paketinin tanımlayıcısını ve yayınlama modunu yapılandırırasset-pack-name/assets/your-asset-directories
: Öğe paketinin bir parçası olarak yayınlanan tüm öğeleri içeren dizin
Gradle, her öğe paketi için manifest oluşturur ve
assets/
dosyasını verir. sizin için derledik.(İsteğe bağlı) Hızlı takip ve isteğe bağlı yayınlama kullanmayı planlıyorsanız Play Asset Delivery Kitaplığı'nı ekleyin.
Eski
implementation "com.google.android.play:asset-delivery:2.3.0" // For Kotlin use asset-delivery-ktx implementation "com.google.android.play:asset-delivery-ktx:2.3.0"
Kotlin
implementation("com.google.android.play:asset-delivery:2.3.0") // For Kotlin use core-ktx implementation("com.google.android.play:asset-delivery-ktx:2.3.0")
(İsteğe bağlı) Uygulama paketinizi farklı doku sıkıştırma biçimlerini destekleyecek şekilde yapılandırın.
Play Asset Delivery API ile entegrasyon
Play Asset Delivery Java API, öğe paketleri istemek, indirmeleri yönetmek ve öğelere erişmek için AssetPackManager
sınıfını sağlar. Önce projenize Play Asset Delivery Kitaplığı'nı eklediğinizden emin olun.
Bu API'yi, erişmek istediğiniz öğe paketinin yayınlama türüne göre uygularsınız. Bu adımlar aşağıdaki akış şemasında gösterilmektedir.
Şekil 1. Öğe paketlerine erişim için akış şeması
Yükleme zamanında teslimat
install-time
olarak yapılandırılmış öğe paketleri, uygulama başlatıldıktan hemen sonra kullanılabilir. Java'yı kullanma
Öğelere erişmek için AssetManager API.
şu modda sunulur:
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");
Hızlı takip ve isteğe bağlı yayınlama
Aşağıdaki bölümlerde, reklam öğenizi başlatmadan önce öğe paketleriyle ilgili
indirme işlemini başlatmak için API'nin nasıl çağrılacağını ve sonra
indirilen paketlere erişin. Bu bölümler fast-follow
ve on-demand
öğe paketleri için geçerlidir.
Durumu denetle
Her öğe paketi, uygulamanın dahili depolama alanında ayrı bir klasörde depolanır.
Şunu kullanın:
getPackLocation()
yöntemini kullanır. Bu yöntem aşağıdaki değerleri döndürür:
Döndürülen değer | Durum |
---|---|
Geçerli bir AssetPackLocation nesnesi |
Öğe paketi kök klasörü, assetsPath() adresinde hemen erişime hazırdır. |
null |
Bilinmeyen öğe paketi veya öğeler kullanılamıyor |
Öğe paketleriyle ilgili indirme bilgilerini alma
Uygulamaların, öğeyi getirmeden önce indirme boyutunu bildirmesi gerekir.
yükleyin. Şunu kullanın:
requestPackStates()
veya getPackStates()
yöntemini kullanarak paketin zaten yüklü olup olmadığını
indiriliyor.
Kotlin
suspend fun requestPackStates(packNames: List<String>): AssetPackStates
Java
Task<AssetPackStates> getPackStates(List<String> packNames)
requestPackStates()
,
AssetPackStates
nesnesidir. getPackStates()
, Task<AssetPackStates>
döndüren eşzamansız bir yöntemdir. İlgili içeriği oluşturmak için kullanılan
packStates()
yöntemi, AssetPackStates
nesnesinin Map<String,
AssetPackState>
değerini döndürür. Bu harita, istenen her bir öğenin durumunu içerir
adı ile anahtarlanmış paket:
Kotlin
AssetPackStates#packStates(): Map<String, AssetPackState>
Java
Map<String, AssetPackState> AssetPackStates#packStates()
Nihai istek aşağıdaki bilgilerde gösterilir:
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; })
Aşağıdakiler
AssetPackState
yöntemleri, öğe paketinin boyutunu, şimdiye kadar indirilen miktarı (varsa) belirtir.
istenen) ve uygulamaya zaten aktarılmış olan tutar:
Bir öğe paketinin durumunu öğrenmek için
status()
yöntemini kullanır. Bu yöntem, durumu sabit bir değere karşılık gelen bir tam sayı
alanındaki
AssetPackStatus
sınıfını kullanır. Henüz yüklenmemiş bir öğe paketi,
AssetPackStatus.NOT_INSTALLED
Bir istek başarısız olursa
errorCode()
yönteminde, döndürülen değer değeri sabit bir alana karşılık gelen
AssetPackErrorCode
sınıfını kullanır.
Yükle
requestFetch()
veya
fetch()
veya bir öğe paketinin güncellenmesi için çağrıda bulunan bir öğe paketi
tamamlanacak öğe paketi:
Kotlin
suspend fun AssetPackManager.requestFetch(packs: List<String>): AssetPackStates
Java
Task<AssetPackStates> fetch(List<String> packNames)
Bu yöntem, paketlerin listesini ve ilk indirme durumlarını ve boyutlarını içeren bir AssetPackStates
nesnesi döndürür.
requestFetch()
veya fetch()
üzerinden istenen bir öğe paketi zaten indiriliyorsa indirme durumu döndürülür ve ek indirme işlemi başlatılmaz.
İndirme durumlarını izleme
Öğe paketlerinin yükleme durumunu izlemek için bir AssetPackStateUpdatedListener
uygulamanız gerekir. Durum güncellemeleri, takip edilmesini desteklemek için paket başına ayrılır
ayrı ayrı öğe paketlerinin durumunu gösterir. İsteğinizle ilgili diğer tüm indirmeler tamamlanmadan önce mevcut öğe paketlerini kullanmaya başlayabilirsiniz.
Kotlin
fun registerListener(listener: AssetPackStateUpdatedListener) fun unregisterListener(listener: AssetPackStateUpdatedListener)
Java
void registerListener(AssetPackStateUpdatedListener listener) void unregisterListener(AssetPackStateUpdatedListener listener)
Büyük boyutlu indirme işlemleri
İndirme 200 MB'tan büyükse ve kullanıcı kablosuz ağa bağlı değilse kullanıcı mobil veri bağlantısı kullanarak indirme işlemine devam etmek için açıkça izin verene kadar indirme işlemi başlamaz. Benzer şekilde, indirme boyutu çok büyükse
Kullanıcı kablosuz bağlantısını kaybeder, indirme işlemi duraklatılır ve işlem için
mobil veri bağlantısı kullanarak devam edin. Duraklatılmış paketin durumu WAITING_FOR_WIFI
'tür. Kullanıcıdan izin isteğinde bulunmasını sağlamak için kullanıcı arayüzü akışını tetiklemek üzere showConfirmationDialog()
yöntemini kullanın.
Uygulama bu yöntemi çağırmazsa indirme işleminin duraklatıldığını ve yalnızca kullanıcı tekrar kablosuz ağa bağlandığında otomatik olarak devam edeceğini unutmayın.
Zorunlu kullanıcı onayı
Bir paket REQUIRES_USER_CONFIRMATION
durumundaysa indirme işlemi yapılamaz.
görüntülenen iletişim kutusunu kabul edene kadar devam edin
showConfirmationDialog()
Bu durum, uygulama Play tarafından tanınmadığında (ör. uygulama başka cihazdan yüklendiğinde) ortaya çıkabilir.
Aramanın
showConfirmationDialog()
bu durumda uygulamanın güncellenmesine neden olur. Güncellemeden sonra, şunlara ihtiyacınız olacak:
tuşuna basarak öğeleri tekrar isteyebilirsiniz.
Aşağıda, bir işleyici uygulaması örneği verilmiştir:
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; } } }
Alternatif olarak,
getPackStates()
yöntemini kullanabilirsiniz.
AssetPackStates
indirme işleminin ilerleme durumunu, indirme durumunu ve tüm hata hata kodlarını içerir.
Öğe paketlerine erişme
İndirme isteği COMPLETED
durumuna ulaştıktan sonra dosya sistemi çağrılarını kullanarak bir öğe paketine erişebilirsiniz. Şunu kullanın:
getPackLocation()
yöntemini kullanabilirsiniz.
Öğeler, öğe paketi kök dizininde assets
dizininde saklanır. assetsPath()
kolaylık yöntemini kullanarak assets
dizininin yolunu alabilirsiniz.
Belirli bir öğenin yolunu almak için aşağıdaki yöntemi kullanın:
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; }
Diğer Play Asset Delivery API yöntemleri
Aşağıda, uygulamanızda kullanmak isteyebileceğiniz bazı ek API yöntemleri verilmiştir.
İsteği iptal et
Tekliflerinizi otomatikleştirmek ve optimize etmek için
cancel()
isteği iptal edebilir. Bu isteğin, olabildiğince iyi
işlemidir.
Öğe paketini kaldırma
Tekliflerinizi otomatikleştirmek ve optimize etmek için
requestRemovePack()
veya
removePack()
bir öğe paketinin kaldırılmasını planlamaktır.
Birden fazla öğe paketinin konumunu alma
Tekliflerinizi otomatikleştirmek ve optimize etmek için
getPackLocations()
birden çok öğe paketinin durumunu toplu olarak sorgulamak için kullanılır. Bu işlem
öğe paketlerine ve konumlarına
bakacağız. getPackLocations()
tarafından döndürülen harita
o anda indirilen ve güncel olan her paket için bir giriş içerir.
Sonraki adım
Play Asset Delivery'yi yerel olarak ve Google Play'den test edin.