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

از Android 11 (سطح 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);
    }
}