Począwszy od Androida 11 (poziom interfejsu API 30) system buforuje duże zbiory danych, wiele aplikacji może mieć dostęp do przypadków użycia, takich jak systemy uczące się czy multimedia odtwarzania. 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 powinna mieć 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()
- 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 udostępnionych blobó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 blobów danych, pobierz z serwera szczegóły identyfikacyjne. Zastosowanie 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, 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 nie jest dostępny, pobierz go z serwera i udostępnij Jak widać w poniższym 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); } }