الوصول إلى مجموعات البيانات المشتركة

بدءًا من Android 11 (المستوى 30 من واجهة برمجة التطبيقات)، يخزِّن النظام مؤقتًا مجموعات البيانات الكبيرة التي يمكن لتطبيقات متعددة الوصول إلى حالات الاستخدام، مثل تعلُّم الآلة والوسائط التشغيل. تساعد هذه الوظيفة في تقليل تكرار البيانات، سواء عبر الشبكة وعلى القرص.

عندما يحتاج تطبيقك إلى الوصول إلى مجموعة بيانات كبيرة مشتركة، يمكنه أولاً البحث عن مجموعات البيانات المخزنة مؤقتًا هذه، المسماة ملفات البيانات المشتركة الثنائية الكبيرة، قبل تحديد ما إذا كان لتنزيل نسخة جديدة. يمكن للتطبيقات الوصول إلى وظائف مجموعات البيانات المشتركة هذه باستخدام واجهات برمجة التطبيقات في BlobStoreManager.

يحتفظ النظام بالملفات الثنائية الكبيرة التي تتم مشاركتها ويحدد التطبيقات التي يمكنها الوصول إلى البيانات. معهم. عندما يساهم تطبيقك في تخزين بيانات ثنائية كبيرة، يمكنك تحديد التطبيقات الأخرى. من خلال استدعاء إحدى الطرق التالية:

  • لمنح إذن الوصول إلى مجموعة محدَّدة من التطبيقات على جهاز، يُرجى إدخال أسماء الحِزم. هذه التطبيقات في allowPackageAccess()
  • للسماح فقط بالتطبيقات التي تم توقيع شهاداتها باستخدام المفتاح نفسه المُستخدَم في الشهادة التطبيق التي تستخدمها لتطبيقك، مثل مجموعة تطبيقات تديرها أنت، اتصل allowSameSignatureAccess()
  • لمنح الإذن بالوصول إلى جميع التطبيقات على جهاز، يُرجى الاتصال allowPublicAccess()

الوصول إلى وحدات تخزين ثنائية كبيرة (blob) للبيانات التي تمت مشاركتها

ويمثل النظام كل نقطة بيانات مشتركة باستخدام 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);
    }
}