शेयर किए गए डेटासेट ऐक्सेस करना

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);
    }
}