अपने Java कोड से ऐप्लिकेशन के ऐसेट पैक ऐक्सेस करने के लिए, इस गाइड में बताया गया तरीका अपनाएं.
Kotlin और Java के लिए ऐप्लिकेशन बनाना
अपने प्रोजेक्ट के Android App Bundle में Play ऐसेट डिलीवरी को शामिल करने के लिए, यह तरीका अपनाएं. यह तरीका अपनाने के लिए, आपको Android Studio का इस्तेमाल करने की ज़रूरत नहीं है.
अपने प्रोजेक्ट की
build.gradleफ़ाइल में, Android Gradle प्लगिन के वर्शन को4.0.0या इसके बाद के वर्शन पर अपडेट करें.अपने प्रोजेक्ट की टॉप-लेवल डायरेक्ट्री में, ऐसेट पैक के लिए एक डायरेक्ट्री बनाएं. इस डायरेक्ट्री के नाम का इस्तेमाल, ऐसेट पैक के नाम के तौर पर किया जाता है. ऐसेट पैक के नाम किसी अक्षर से शुरू होने चाहिए. इनमें सिर्फ़ अक्षर, संख्याएं, और अंडरस्कोर शामिल हो सकते हैं.
ऐसेट पैक डायरेक्ट्री में,
build.gradleफ़ाइल बनाएं और यह कोड जोड़ें. ऐसेट पैक का नाम और डिलीवरी का सिर्फ़ एक टाइप ज़रूर बताएं:Groovy
// 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 ]") } }
प्रोजेक्ट की ऐप्लिकेशन
build.gradleफ़ाइल में, अपने प्रोजेक्ट के हर ऐसेट पैक का नाम जोड़ें, जैसा कि यहां दिखाया गया है:Groovy
// 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") }
प्रोजेक्ट की
settings.gradleफ़ाइल में, अपने प्रोजेक्ट के सभी ऐसेट पैक शामिल करें. इसके लिए, यहां दिया गया तरीका अपनाएं:Groovy
// 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")
ऐसेट पैक डायरेक्ट्री में, यह सबडायरेक्ट्री बनाएं:
src/main/assets.ऐसेट को
src/main/assetsडायरेक्ट्री में रखें. यहां सबडायरेक्ट्री भी बनाई जा सकती हैं. आपके ऐप्लिकेशन की डायरेक्ट्री का स्ट्रक्चर अब ऐसा दिखना चाहिए:build.gradlesettings.gradleapp/asset-pack-name/build.gradleasset-pack-name/src/main/assets/your-asset-directories
Gradle की मदद से Android ऐप्लिकेशन बंडल बनाना. जनरेट किए गए ऐप्लिकेशन बंडल में, रूट-लेवल डायरेक्ट्री में अब ये चीज़ें शामिल हैं:
asset-pack-name/manifest/AndroidManifest.xml: यह ऐसेट पैक के आइडेंटिफ़ायर और डिलीवरी मोड को कॉन्फ़िगर करता हैasset-pack-name/assets/your-asset-directories: ऐसी डायरेक्ट्री जिसमें ऐसेट पैक के तौर पर डिलीवर की गई सभी ऐसेट शामिल होती हैं
Gradle, हर ऐसेट पैक के लिए मेनिफ़ेस्ट जनरेट करता है और आपके लिए
assets/डायरेक्ट्री आउटपुट करता है.(ज़रूरी नहीं) अगर आपको फ़ास्ट-फ़ॉलो और मांग पर डिलीवरी की सुविधा का इस्तेमाल करना है, तो Play ऐसेट डिलीवरी लाइब्रेरी को शामिल करें
Groovy
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")
(ज़रूरी नहीं) अपने ऐप्लिकेशन बंडल को अलग-अलग टेक्सचर कंप्रेसन फ़ॉर्मैट के साथ काम करने के लिए कॉन्फ़िगर करें.
Play ऐसेट डिलीवरी एपीआई के साथ इंटिग्रेट करना
Play ऐसेट डिलीवरी Java API,
AssetPackManager
क्लास उपलब्ध कराता है. इसका इस्तेमाल करके, ऐसेट पैक का अनुरोध किया जा सकता है, डाउनलोड मैनेज किए जा सकते हैं, और ऐसेट ऐक्सेस की जा सकती हैं. सबसे पहले, अपने प्रोजेक्ट में Play ऐसेट डिलीवरी लाइब्रेरी जोड़ें.
इस एपीआई को, आपको जिस ऐसेट पैक को ऐक्सेस करना है उसके डिलीवरी टाइप के हिसाब से लागू किया जाता है. इन चरणों को इस फ़्लोचार्ट में दिखाया गया है.
पहली इमेज. ऐसेट पैक ऐक्सेस करने के लिए फ़्लो डायग्राम
ऐप्लिकेशन इंस्टॉल करते समय डिलीवरी
install-time के तौर पर कॉन्फ़िगर किए गए ऐसेट पैक, ऐप्लिकेशन लॉन्च होने पर तुरंत उपलब्ध हो जाते हैं. इस मोड में उपलब्ध कराई गई ऐसेट को ऐक्सेस करने के लिए, Java AssetManager API का इस्तेमाल करें:
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");
तेज़ी से और मांग पर डिलीवरी
यहां दिए गए सेक्शन में, ऐसेट पैक डाउनलोड करने से पहले उनके बारे में जानकारी पाने का तरीका बताया गया है. साथ ही, डाउनलोड शुरू करने के लिए एपीआई को कॉल करने और डाउनलोड किए गए पैक को ऐक्सेस करने का तरीका भी बताया गया है. ये सेक्शन, fast-follow और on-demand ऐसेट पैक पर लागू होते हैं.
स्टेटस देखें
हर ऐसेट पैक को ऐप्लिकेशन के इंटरनल स्टोरेज में, एक अलग फ़ोल्डर में सेव किया जाता है.
किसी ऐसेट पैक के रूट फ़ोल्डर का पता लगाने के लिए,
getPackLocation()
तरीके का इस्तेमाल करें. इस तरीके से ये वैल्यू मिलती हैं:
| रिटर्न वैल्यू | स्थिति |
|---|---|
एक मान्य AssetPackLocation ऑब्जेक्ट |
ऐसेट पैक का रूट फ़ोल्डर, assetsPath() पर तुरंत ऐक्सेस करने के लिए तैयार है |
null |
ऐसेट पैक के बारे में जानकारी नहीं है या ऐसेट उपलब्ध नहीं हैं |
ऐसेट पैक के डाउनलोड की जानकारी पाना
ऐप्लिकेशन को ऐसेट पैक फ़ेच करने से पहले, डाउनलोड किए जाने वाले डेटा का साइज़ बताना ज़रूरी है. डाउनलोड किए जाने वाले पैक का साइज़ पता करने के लिए, requestPackStates() या getPackStates() तरीके का इस्तेमाल करें. इससे यह भी पता चलता है कि पैक पहले से डाउनलोड हो रहा है या नहीं.
Kotlin
suspend fun requestPackStates(packNames: List<String>): AssetPackStates
Java
Task<AssetPackStates> getPackStates(List<String> packNames)
requestPackStates() एक सस्पेंड फ़ंक्शन है, जो AssetPackStates ऑब्जेक्ट दिखाता है. वहीं, getPackStates() एक एसिंक्रोनस तरीका है, जो Task<AssetPackStates> दिखाता है. AssetPackStates ऑब्जेक्ट का packStates() तरीका, Map<String,
AssetPackState> दिखाता है. इस मैप में, अनुरोध किए गए हर ऐसेट पैक की स्थिति की जानकारी होती है. इसे ऐसेट पैक के नाम से खोजा जा सकता है:
Kotlin
AssetPackStates#packStates(): Map<String, AssetPackState>
Java
Map<String, AssetPackState> AssetPackStates#packStates()
फ़ाइनल अनुरोध यहां दिखाया गया है:
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; })
यहां दिए गए
AssetPackState
तरीकों से, ऐसेट पैक का साइज़, अब तक डाउनलोड किए गए डेटा की जानकारी (अगर अनुरोध किया गया हो), और ऐप्लिकेशन में पहले से ट्रांसफ़र किए गए डेटा की जानकारी मिलती है:
किसी ऐसेट पैक का स्टेटस जानने के लिए, status()
तरीके का इस्तेमाल करें. यह स्टेटस को एक पूर्णांक के तौर पर दिखाता है, जो
AssetPackStatus
क्लास में मौजूद कॉन्स्टेंट फ़ील्ड से जुड़ा होता है. ऐसे ऐसेट पैक का स्टेटस AssetPackStatus.NOT_INSTALLED होता है जो अब तक इंस्टॉल नहीं किया गया है.
अगर कोई अनुरोध पूरा नहीं हो पाता है, तो
errorCode()
तरीके का इस्तेमाल करें. इसकी रिटर्न वैल्यू, AssetPackErrorCode
क्लास में मौजूद कॉन्स्टेंट फ़ील्ड से मेल खाती है.
इंस्टॉल करें
पहली बार ऐसेट पैक डाउनलोड करने के लिए, requestFetch() या fetch() तरीके का इस्तेमाल करें. इसके अलावा, ऐसेट पैक के अपडेट को पूरा करने के लिए, इस तरीके को कॉल करें:
Kotlin
suspend fun AssetPackManager.requestFetch(packs: List<String>): AssetPackStates
Java
Task<AssetPackStates> fetch(List<String> packNames)
यह तरीका, AssetPackStates ऑब्जेक्ट दिखाता है. इसमें पैक की सूची के साथ-साथ, उनके शुरुआती डाउनलोड की स्थितियों और साइज़ की जानकारी होती है.
अगर requestFetch() या fetch() के ज़रिए अनुरोध किया गया ऐसेट पैक पहले से डाउनलोड हो रहा है, तो डाउनलोड की स्थिति दिखती है और कोई अन्य डाउनलोड शुरू नहीं होता है.
डाउनलोड की स्थिति पर नज़र रखना
ऐसेट पैक के इंस्टॉल होने की प्रोग्रेस को ट्रैक करने के लिए, आपको AssetPackStateUpdatedListener लागू करना चाहिए. स्टेटस अपडेट को हर पैक के हिसाब से बांटा जाता है, ताकि अलग-अलग ऐसेट पैक के स्टेटस को ट्रैक किया जा सके. आपके अनुरोध के लिए, अन्य सभी डाउनलोड पूरे होने से पहले, उपलब्ध ऐसेट पैक का इस्तेमाल शुरू किया जा सकता है.
Kotlin
fun registerListener(listener: AssetPackStateUpdatedListener) fun unregisterListener(listener: AssetPackStateUpdatedListener)
Java
void registerListener(AssetPackStateUpdatedListener listener) void unregisterListener(AssetPackStateUpdatedListener listener)
ज़्यादा स्टोरेज वाले डाउनलोड
अगर डाउनलोड किए जाने वाले डेटा का साइज़ 200 एमबी से ज़्यादा है और उपयोगकर्ता वाई-फ़ाई से कनेक्ट नहीं है, तो डाउनलोड तब तक शुरू नहीं होता, जब तक उपयोगकर्ता मोबाइल डेटा कनेक्शन का इस्तेमाल करके डाउनलोड करने की साफ़ तौर पर सहमति नहीं देता. इसी तरह, अगर डाउनलोड की जाने वाली फ़ाइल का साइज़ बड़ा है और उपयोगकर्ता का वाई-फ़ाई कनेक्शन बंद हो जाता है, तो डाउनलोड की प्रोसेस रुक जाती है. मोबाइल डेटा कनेक्शन का इस्तेमाल करके डाउनलोड की प्रोसेस जारी रखने के लिए, उपयोगकर्ता की साफ़ तौर पर सहमति ज़रूरी है. रोके गए पैक की स्थिति
WAITING_FOR_WIFI होती है. उपयोगकर्ता से सहमति लेने के लिए, यूज़र इंटरफ़ेस (यूआई) फ़्लो को ट्रिगर करने के लिए, showConfirmationDialog() तरीके का इस्तेमाल करें.
ध्यान दें कि अगर ऐप्लिकेशन इस तरीके को कॉल नहीं करता है, तो डाउनलोड रोक दिया जाता है. यह सिर्फ़ तब अपने-आप फिर से शुरू होगा, जब उपयोगकर्ता वाई-फ़ाई कनेक्शन पर वापस आएगा.
उपयोगकर्ता की सहमति ज़रूरी है
अगर किसी पैक का स्टेटस REQUIRES_USER_CONFIRMATION है, तो डाउनलोड तब तक शुरू नहीं होगा, जब तक उपयोगकर्ता showConfirmationDialog() के साथ दिखाए गए डायलॉग बॉक्स को स्वीकार नहीं करता.
यह स्थिति तब हो सकती है, जब Play को ऐप्लिकेशन की पहचान न मिले. उदाहरण के लिए, अगर ऐप्लिकेशन को साइड-लोड किया गया हो.
ध्यान दें कि इस मामले में showConfirmationDialog() को कॉल करने पर, ऐप्लिकेशन अपडेट हो जाएगा. अपडेट के बाद, आपको ऐसेट के लिए
फिर से अनुरोध करना होगा.
यहां लिसनर को लागू करने का एक उदाहरण दिया गया है:
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; } } }
इसके अलावा, मौजूदा डाउनलोड की स्थिति जानने के लिए,
getPackStates()
तरीके का इस्तेमाल किया जा सकता है.
AssetPackStates
में डाउनलोड की प्रोग्रेस, डाउनलोड की स्थिति, और डाउनलोड न होने पर गड़बड़ी के कोड शामिल होते हैं.
ऐसेट पैक ऐक्सेस करना
डाउनलोड करने का अनुरोध
COMPLETED
स्थिति में पहुंचने के बाद, फ़ाइल सिस्टम कॉल का इस्तेमाल करके ऐसेट पैक को ऐक्सेस किया जा सकता है. ऐसेट पैक का रूट फ़ोल्डर पाने के लिए,
getPackLocation()
तरीके का इस्तेमाल करें.
ऐसेट, ऐसेट पैक की रूट डायरेक्ट्री में मौजूद assets डायरेक्ट्री में सेव होती हैं. assetsPath() तरीके का इस्तेमाल करके, assets डायरेक्ट्री का पाथ पाया जा सकता है.
किसी खास ऐसेट का पाथ पाने के लिए, यह तरीका अपनाएं:
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; }
Play ऐसेट डिलीवरी एपीआई के अन्य तरीके
यहां एपीआई के कुछ अन्य तरीके दिए गए हैं, जिन्हें अपने ऐप्लिकेशन में इस्तेमाल किया जा सकता है.
अनुरोध रद्द करें
किसी चालू ऐसेट पैक के अनुरोध को रद्द करने के लिए,
cancel()
का इस्तेमाल करें. ध्यान दें कि यह अनुरोध, सबसे सही तरीके से की जाने वाली कार्रवाई है.
किसी ऐसेट पैक को हटाना
किसी ऐसेट पैक को हटाने का शेड्यूल तय करने के लिए,
requestRemovePack()
या
removePack()
का इस्तेमाल करें.
एक से ज़्यादा ऐसेट पैक की जगह की जानकारी पाना
एक साथ कई ऐसेट पैक की स्थिति के बारे में क्वेरी करने के लिए, getPackLocations()
का इस्तेमाल करें. इससे ऐसेट पैक और उनकी जगहों का मैप मिलता है. getPackLocations() से मिले मैप में, हर उस पैक की एंट्री होती है जो फ़िलहाल डाउनलोड किया गया है और अप-टू-डेट है.
अगला चरण
Play ऐसेट डिलीवरी की सुविधा को टेस्ट करें. इसके लिए, इसे स्थानीय तौर पर और Google Play से टेस्ट किया जा सकता है.