Mengakses set data bersama

Mulai Android 11 (level API 30), sistem akan menyimpan dalam cache set data besar yang dapat diakses beberapa aplikasi untuk kasus penggunaan seperti machine learning dan pemutaran media. Fungsi ini membantu mengurangi redundansi data, baik melalui jaringan maupun di disk.

Saat memerlukan akses ke set data besar bersama, aplikasi dapat terlebih dahulu mencari set data yang di-cache ini, yang disebut blob data bersama, sebelum menentukan apakah akan mendownload salinan baru atau tidak. Aplikasi dapat mengakses fungsi set data bersama ini menggunakan API di BlobStoreManager.

Sistem akan mengelola blob data bersama dan mengontrol aplikasi mana yang dapat mengaksesnya. Saat aplikasi Anda mengontribusikan blob data, Anda dapat memberi tanda pada aplikasi lain yang harus memiliki akses dengan memanggil salah satu metode berikut:

  • Untuk memberikan akses ke sekumpulan aplikasi tertentu di perangkat, teruskan nama paket aplikasi tersebut ke allowPackageAccess().
  • Untuk hanya mengizinkan aplikasi yang sertifikatnya ditandatangani menggunakan kunci yang sama dengan yang digunakan untuk aplikasi Anda, seperti rangkaian aplikasi yang Anda kelola, panggil allowSameSignatureAccess().
  • Untuk memberikan akses ke semua aplikasi di perangkat, panggil allowPublicAccess().

Mengakses blob data bersama

Sistem mewakili setiap blob data bersama menggunakan objek BlobHandle. Setiap instance BlobHandle berisi hash yang aman secara kriptografi dan beberapa detail identifikasi untuk set data.

Untuk mengakses blob data bersama, download detail identifikasi dari server. Gunakan detail ini untuk memeriksa apakah set data sudah tersedia di sistem.

Langkah berikutnya bergantung pada apakah data tersedia atau tidak.

Set data tersedia

Jika sudah tersedia di perangkat, akses set data tersebut dari sistem, seperti yang ditampilkan dalam cuplikan kode berikut:

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

Set data tidak tersedia

Jika tidak tersedia, download set data tersebut dari server dan kontribusikan ke sistem, seperti yang ditampilkan dalam cuplikan kode berikut:

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