Od Androida 11 (poziom interfejsu API 30) system buforuje duże zbiory danych, do których może mieć dostęp wiele aplikacji, na potrzeby takich zastosowań jak uczenie maszynowe i odtwarzanie multimediów. Ta funkcja pomaga zmniejszyć nadmiarowość danych zarówno w sieci, jak i na dysku.
Gdy aplikacja potrzebuje dostępu do udostępnionego dużego zbioru danych, może najpierw wyszukać
te zbuforowane zbiory danych, nazywane blobami danych udostępnionych, zanim zdecyduje, czy
pobrać nową kopię. Aplikacje mogą korzystać z tych udostępnionych zbiorów danych za pomocą
interfejsów API w BlobStoreManager.
System utrzymuje udostępnione bloby danych i kontroluje, które aplikacje mogą mieć do nich dostęp. Gdy 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, przekaż nazwy pakietów
tych aplikacji do
allowPackageAccess(). - Aby zezwolić tylko aplikacjom, których certyfikaty są podpisane tym samym kluczem co klucz używany w Twojej aplikacji (np. pakiet aplikacji, którym zarządzasz), wywołaj
allowSameSignatureAccess(). - Aby przyznać dostęp do wszystkich aplikacji na urządzeniu, wywołaj
allowPublicAccess().
Dostęp do udostępnionych danych BLOB
System reprezentuje każdy udostępniony blob danych za pomocą obiektu
BlobHandle. Każda instancja BlobHandle zawiera bezpieczny kryptograficznie skrót i pewne szczegóły identyfikacyjne zbioru danych.
Aby uzyskać dostęp do udostępnionych danych blobów, pobierz szczegóły identyfikacyjne z serwera. Na podstawie tych szczegółów sprawdź, czy zbiór danych jest już dostępny w systemie.
Następny 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, uzyskaj do niego dostęp z systemu, jak pokazano 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 jest niedostępny
Jeśli zbiór danych nie jest dostępny, pobierz go z serwera i udostępnij w systemie, 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); } }