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 zmniejszyć redundancję danych zarówno w sieci, jak i na dysku.
Gdy aplikacja potrzebuje dostępu do udostępnionego dużego zbioru danych, może najpierw poszukać tych zarchiwizowanych zbiorów danych, zwanych blobami danych współdzielonych, zanim zdecyduje, czy pobrać nową kopię. Aplikacje mogą korzystać z funkcji udostępnianych zbiorów danych za pomocą interfejsów API w BlobStoreManager
.
System zarządza udostępnianymi blobami danych i określa, które aplikacje mają do nich 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()
. - Aby zezwolić tylko na aplikacje, których certyfikaty są podpisane tym samym kluczem, co klucz używany w Twojej aplikacji (np. pakiet aplikacji, którym zarządzasz), zadzwoń pod numer
allowSameSignatureAccess()
. - Aby przyznać dostęp do wszystkich aplikacji na urządzeniu, zadzwoń pod numer
allowPublicAccess()
.
Dostęp do wspólnych obiektów danych
System reprezentuje każdy udostępniony blok danych za pomocą obiektu BlobHandle
. Każdy egzemplarz BlobHandle
zawiera zabezpieczony kryptograficznie ciąg znaków i niektóre szczegóły identyfikacyjne dotyczące zbioru danych.
Aby uzyskać dostęp do udostępnionych bloków danych, pobierz identyfikatory z serwera. Na podstawie tych informacji sprawdź, czy zbiór danych jest już dostępny w systemie.
Następny krok zależy od tego, czy dane są dostępne.
Dostępny zbiór danych
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 niedostępny
Jeśli zbiór danych jest niedostępny, pobierz go z serwera i przekaż 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); } }