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

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