Öğe teslimini entegre etme (Kotlin ve Java)

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.

  1. Projenizde Android Gradle eklentisinin sürümünü güncelleyin. build.gradle dosyasını 4.0.0 veya sonraki bir dosyaya gönderin.

  2. Projenizin üst düzey dizininde, öğe için bir dizin oluşturun yükleyin. Bu dizin adı, öğe paketi adı olarak kullanılıyor. Öğe paketi adları bir harfle başlamalıdır ve yalnızca harf, rakam ve alt çizgi.

  3. Öğe paketi dizininde, bir build.gradle dosyası oluşturun ve aşağıdaki kodu kullanabilirsiniz. Öğe paketinin adını ve yalnızca bir ad belirttiğinizden emin olun. teslim türü:

    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 ]")
      }
    }
    
  4. Projenin uygulamasındaki build.gradle dosyasına her öğe paketinin adını ekleyin projenizde ekleyebilirsiniz:

    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")
    }
    
  5. 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")
    
  6. Öğe paketi dizininde aşağıdaki alt dizini oluşturun: src/main/assets

  7. Öğeleri src/main/assets dizinine yerleştirin. Hesap oluşturma alt dizinlerinden de bahsetmek istiyorum. Uygulamanızın dizin yapısı, aşağıdaki gibi görünür:

    • build.gradle
    • settings.gradle
    • app/
    • asset-pack-name/build.gradle
    • asset-pack-name/src/main/assets/your-asset-directories
  8. 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 iletim modunu yapılandırır
    • asset-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.

  9. (İ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.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")
    

  10. (İsteğe bağlı) Uygulama paketinizi farklı dokuyu destekleyecek şekilde yapılandırın biçimleriyle ilgili daha fazla bilgi edinin.

ziyaret edin.

Play Asset Delivery API ile entegrasyon

Play Asset Delivery Java API sağlar AssetPackManager öğe paketi isteğinde bulunma, indirmeleri yönetme ve öğelere erişim sınıfı. Önce projenize Play Asset Delivery Kitaplığı'nı eklediğinizden emin olun.

Bu API'yi, istediğiniz öğe paketinin yayınlanma türüne göre uygularsınız. tıklayın. Bu adımlar aşağıdaki akış şemasında gösterilmektedir.

Java programlama dili için öğe paketi akış diyagramı

Şekil 1. Öğe paketlerine erişim için akış şeması

Yükleme zamanında teslimat

install-time olarak yapılandırılan öğe paketleri uygulamada hemen kullanılabilir lansman sonrasında gerçekleşebilir. 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ı teslimat

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 paketi.

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 şu değerlere sahiptir:

Döndürülen değer Durum
Geçerli bir AssetPackLocation nesnesi Öğe paketi kök klasörüne assetsPath() adresinden hemen erişebilirsiniz
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, AssetPackStates ilk indirme durumlarını ve boyutlarını içeren bir pakettir. requestFetch() veya fetch() üzerinden istenen bir öğe paketi zaten indiriliyorsa indirme işlemi durum döndürülür ve başka bir indirme işlemi başlatılmaz.

İndirme durumlarını izle

Etiketleme hakkında daha fazla bilgi edinmek için AssetPackStateUpdatedListener yükleme durumunu takip etmek için paket. Durum güncellemeleri, takip edilmesini desteklemek için paket başına ayrılır ayrı ayrı öğe paketlerinin durumunu gösterir. Mevcut öğe paketlerini kullanmaya başlayabilirsiniz ve isteğiniz için diğer tüm indirme işlemleri tamamlanmadan önce.

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 boyutu 200 MB'tan büyükse ve kullanıcı kablosuz ağa bağlı değilse indirme işlemi kullanıcı işlemlere devam etmek için açıkça izin verene kadar başlamaz. mobil veri bağlantısı kullanarak indirin. 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ış pakette durum var WAITING_FOR_WIFI Kullanıcı rızası isteme amacıyla kullanıcı arayüzü akışını tetiklemek için showConfirmationDialog() yöntemidir.

Uygulama bu yöntemi çağırmıyorsa indirme işleminin duraklatılacağını ve Yalnızca kullanıcı tekrar kablosuz ağa bağlandığında otomatik olarak devam ettirilir.

Zorunlu kullanıcı onayı

Bir paket REQUIRES_USER_CONFIRMATION durumundaysa indirme işlemi yapılamaz. gösterilen iletişim kutusunu kabul edene kadar devam edin showConfirmationDialog() Bu durum, uygulama Play tarafından tanınmadığında ortaya çıkabilir. Örneğin, uygulama farklı yöntemle yüklendi. 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ına örnek 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ğinden sonra dosya sistemi çağrılarını kullanarak bir öğe paketine erişebilirsiniz. ulaşmak için COMPLETED durumu. Şunu kullanın: getPackLocation() yöntemini kullanabilirsiniz.

Öğeler, öğe paketi kök dizinindeki assets dizininde depolanır dizin. assets dizininin yolunu almak için kolaylık yöntemi assetsPath() 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 ayrıntılı 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 test edin. Google Play