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

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