Android 11 (एपीआई लेवल 30) से, सिस्टम बड़े डेटासेट को कैश मेमोरी में सेव करता है. ऐसा इसलिए किया जाता है, ताकि कई ऐप्लिकेशन मशीन लर्निंग और मीडिया चलाने जैसे इस्तेमाल के मामलों के लिए, इन डेटासेट को ऐक्सेस कर सकें. इस सुविधा से, नेटवर्क और डिस्क, दोनों पर डेटा की डुप्लीकेसी को कम करने में मदद मिलती है.
जब आपके ऐप्लिकेशन को शेयर किए गए बड़े डेटासेट का ऐक्सेस चाहिए होता है, तो वह सबसे पहले कैश मेमोरी में सेव किए गए इन डेटासेट को ढूंढ सकता है. इन्हें शेयर किए गए डेटा ब्लोब कहा जाता है. इसके बाद, वह यह तय करता है कि नई कॉपी डाउनलोड करनी है या नहीं. ऐप्लिकेशन, शेयर किए गए डेटासेट की इन सुविधाओं को ऐक्सेस कर सकते हैं. इसके लिए, उन्हें BlobStoreManager
में मौजूद एपीआई का इस्तेमाल करना होगा.
सिस्टम, शेयर किए गए डेटा के बड़े हिस्से को बनाए रखता है. साथ ही, यह कंट्रोल करता है कि कौनसे ऐप्लिकेशन उन्हें ऐक्सेस कर सकते हैं. जब आपका ऐप्लिकेशन डेटा ब्लोब का योगदान देता है, तब यह बताया जा सकता है कि किन अन्य ऐप्लिकेशन को डेटा का ऐक्सेस होना चाहिए. इसके लिए, इनमें से किसी एक तरीके का इस्तेमाल करें:
- किसी डिवाइस पर ऐप्लिकेशन के किसी खास सेट को ऐक्सेस करने की अनुमति देने के लिए, इन ऐप्लिकेशन के पैकेज के नाम
allowPackageAccess()
में पास करें. - सिर्फ़ उन ऐप्लिकेशन को अनुमति दें जिनके सर्टिफ़िकेट, आपके ऐप्लिकेशन के लिए इस्तेमाल की गई कुंजी से साइन किए गए हैं. जैसे, आपके मैनेज किए जाने वाले ऐप्लिकेशन का सुइट. इसके लिए,
allowSameSignatureAccess()
को कॉल करें. - किसी डिवाइस पर मौजूद सभी ऐप्लिकेशन का ऐक्सेस देने के लिए,
allowPublicAccess()
को कॉल करें.
शेयर किए गए डेटा ब्लोब ऐक्सेस करना
सिस्टम, शेयर किए गए हर डेटा ब्लोब को BlobHandle
ऑब्जेक्ट का इस्तेमाल करके दिखाता है. BlobHandle
के हर इंस्टेंस में, क्रिप्टोग्राफ़िक रूप से सुरक्षित हैश और डेटासेट की पहचान करने वाली कुछ जानकारी होती है.
शेयर किए गए डेटा ब्लोब को ऐक्सेस करने के लिए, सर्वर से पहचान करने वाली जानकारी डाउनलोड करें. इस जानकारी का इस्तेमाल करके, यह देखें कि डेटासेट सिस्टम पर पहले से उपलब्ध है या नहीं.
अगला चरण इस बात पर निर्भर करता है कि डेटा उपलब्ध है या नहीं.
डेटासेट उपलब्ध है
अगर डेटासेट डिवाइस पर पहले से मौजूद है, तो सिस्टम से इसे ऐक्सेस करें. इसके लिए, यहां दिए गए कोड स्निपेट का इस्तेमाल करें:
Kotlin
val blobStoreManager = getSystemService(Context.BLOB_STORE_SERVICE) as BlobStoreManager // The label "Sample photos" is visible to the user. val blobHandle = BlobHandle.createWithSha256(sha256DigestBytes, "Sample photos", System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1), "photoTrainingDataset") try { val input = ParcelFileDescriptor.AutoCloseInputStream( blobStoreManager.openBlob(blobHandle)) useDataset(input) }
Java
BlobStoreManager blobStoreManager = ((BlobStoreManager) getSystemService(Context.BLOB_STORE_SERVICE)); if (blobStoreManager != null) { // The label "Sample photos" is visible to the user. BlobHandle blobHandle = BlobHandle.createWithSha256( sha256DigestBytes, "Sample photos", System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1), "photoTrainingDataset"); try (InputStream input = new ParcelFileDescriptor.AutoCloseInputStream( blobStoreManager.openBlob(blobHandle))) { useDataset(input); } }
डेटासेट उपलब्ध नहीं है
अगर डेटासेट उपलब्ध नहीं है, तो उसे सर्वर से डाउनलोड करें और सिस्टम में योगदान दें. इसके लिए, नीचे दिए गए कोड स्निपेट का इस्तेमाल करें:
Kotlin
val sessionId = blobStoreManager.createSession(blobHandle) try { val session = blobStoreManager.openSession(sessionId) try { // For this example, write 200 MiB at the beginning of the file. val output = ParcelFileDescriptor.AutoCloseOutputStream( session.openWrite(0, 1024 * 1024 * 200)) writeDataset(output) session.apply { allowSameSignatureAccess() allowPackageAccess(your-app-package, app-certificate) allowPackageAccess(some-other-app-package, app-certificate) commit(mainExecutor, callback) } } }
Java
long sessionId = blobStoreManager.createSession(blobHandle); try (BlobStoreManager.Session session = blobStoreManager.openSession(sessionId)) { // For this example, write 200 MiB at the beginning of the file. try (OutputStream output = new ParcelFileDescriptor.AutoCloseOutputStream( session.openWrite(0, 1024 * 1024 * 200))) writeDataset(output); session.allowSameSignatureAccess(); session.allowPackageAccess(your-app-package, app-certificate); session.allowPackageAccess(some-other-app-package, app-certificate); session.commit(getMainExecutor(), callback); } }