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

بدءًا من الإصدار 11 من Android (المستوى 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);
    }
}