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