Począwszy od Androida 11 (poziom API 30) system przechowuje w pamięci podręcznej duże zbiory danych, do których może mieć dostęp wiele aplikacji w przypadku takich zastosowań jak systemy uczące się i odtwarzanie multimediów. Ta funkcja pomaga ograniczyć nadmiarowość danych, zarówno w sieci, i na dysku.
Gdy aplikacja potrzebuje dostępu do udostępnionego dużego zbioru danych, może najpierw poszukać
te zbiory danych w pamięci podręcznej, nazywane udostępnionymi blobami danych, przed określeniem, czy
pobierz nową kopię. Aplikacje mogą uzyskać dostęp do funkcji udostępnianych zbiorów danych za pomocą
interfejsów API w projekcie BlobStoreManager
.
System utrzymuje udostępnione bloby danych i kontroluje, które aplikacje mają dostęp . Gdy Twoja aplikacja udostępnia bloby danych, możesz wskazać, które inne aplikacje powinny mieć do nich dostęp, wywołując jedną z tych metod:
- Aby przyznać dostęp do określonego zestawu aplikacji na urządzeniu, prześlij nazwy pakietów tych aplikacji do
allowPackageAccess()
. - Zezwalanie tylko na aplikacje, których certyfikaty są podpisane tym samym kluczem co ten klucz
używane w Twojej aplikacji (np. z pakietem aplikacji, którym zarządzasz),
allowSameSignatureAccess()
- Aby przyznać dostęp do wszystkich aplikacji na urządzeniu, wywołaj
allowPublicAccess()
Dostęp do wspólnych obiektów danych
System reprezentuje każdy udostępniony blob danych za pomocą
BlobHandle
. Każde wystąpienie instancji BlobHandle
zawiera zabezpieczony kryptograficznie hasz oraz niektóre szczegóły identyfikujące
w gromadzeniu danych.
Aby uzyskać dostęp do udostępnionych bloków danych, pobierz z serwera szczegóły identyfikacyjne. Zastosowanie sprawdź, czy zbiór danych jest już dostępny w systemie.
Kolejny krok zależy od tego, czy dane są dostępne.
Zbiór danych jest dostępny
Jeśli zbiór danych jest już dostępny na urządzeniu, otwórz go w systemie Jak widać w tym fragmencie kodu:
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); } }
Zbiór danych niedostępny
Jeśli zbiór danych jest niedostępny, pobierz go z serwera i prześlij do systemu, jak pokazano w tym fragmencie kodu:
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); } }