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

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

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

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

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

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

يمثّل النظام كل كائن بيانات ثنائي كبير (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);
    }
}