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

بدءًا من نظام التشغيل 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);
    }
}