دسترسی به مجموعه داده های مشترک

با شروع در Android 11 (سطح API 30)، سیستم مجموعه داده های بزرگی را ذخیره می کند که ممکن است چندین برنامه برای موارد استفاده مانند یادگیری ماشین و پخش رسانه به آنها دسترسی داشته باشند. این قابلیت به کاهش افزونگی داده ها، هم در شبکه و هم روی دیسک کمک می کند.

هنگامی که برنامه شما نیاز به دسترسی به یک مجموعه داده بزرگ مشترک دارد، ابتدا می‌تواند این مجموعه داده‌های ذخیره‌شده را که به نام حباب‌های داده مشترک نامیده می‌شوند، جستجو کند، قبل از اینکه تصمیم بگیرد یک نسخه جدید را دانلود کند یا خیر. برنامه‌ها می‌توانند با استفاده از APIهای موجود در BlobStoreManager به این عملکرد مجموعه داده‌های مشترک دسترسی داشته باشند.

این سیستم حباب های داده مشترک را حفظ می کند و کنترل می کند که کدام برنامه ها می توانند به آنها دسترسی داشته باشند. هنگامی که برنامه شما حباب های داده را ارائه می دهد، می توانید با فراخوانی یکی از روش های زیر مشخص کنید که کدام برنامه های دیگر باید دسترسی داشته باشند:

  • برای اعطای دسترسی به مجموعه خاصی از برنامه‌ها در دستگاه، نام بسته‌های این برنامه‌ها را به allowPackageAccess() ارسال کنید.
  • برای اجازه دادن فقط به برنامه‌هایی که گواهی‌هایشان با استفاده از کلیدی که برای برنامه شما استفاده می‌شود امضا می‌شود - مانند مجموعه برنامه‌هایی که مدیریت می‌کنید - با allowSameSignatureAccess() تماس بگیرید.
  • برای اعطای دسترسی به همه برنامه‌های موجود در یک دستگاه، با allowPublicAccess() تماس بگیرید.

به حباب های داده مشترک دسترسی داشته باشید

این سیستم هر حباب داده مشترک را با استفاده از یک شی BlobHandle نشان می دهد. هر نمونه از BlobHandle حاوی یک هش رمزنگاری امن و برخی جزئیات شناسایی برای مجموعه داده است.

برای دسترسی به حباب های داده مشترک، جزئیات شناسایی را از سرور دانلود کنید. با استفاده از این جزئیات، بررسی کنید که آیا مجموعه داده از قبل در سیستم موجود است یا خیر.

مرحله بعدی بستگی به در دسترس بودن داده ها دارد.

مجموعه داده موجود است

اگر مجموعه داده از قبل در دستگاه موجود است، همانطور که در قطعه کد زیر نشان داده شده است، از سیستم به آن دسترسی داشته باشید:

کاتلین

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

جاوا

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

مجموعه داده در دسترس نیست

اگر مجموعه داده در دسترس نیست، آن را از سرور دانلود کنید و به سیستم کمک کنید، همانطور که در قطعه کد زیر نشان داده شده است:

کاتلین

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

جاوا

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