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

از اندروید ۱۱ (سطح 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);
    }
}