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

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