Począwszy 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 systemów uczących się i odtwarzania multimediów. Ta funkcja pomaga ograniczyć nadmiarowość danych zarówno w sieci, jak i na dysku.
Gdy aplikacja potrzebuje dostępu do udostępnionego dużego zbioru danych, przed podjęciem decyzji o pobraniu nowej kopii może najpierw poszukać w pamięci podręcznej zbiorów danych nazywanych udostępnionymi obiektami blobów danych. Aplikacje mogą korzystać z funkcji udostępnianych zbiorów danych za pomocą interfejsów API w BlobStoreManager
.
System utrzymuje udostępnione bloby danych i kontroluje, 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, przekaż nazwy pakietów tych aplikacji do usługi
allowPackageAccess()
. - Aby zezwolić tylko na aplikacje, których certyfikaty są podpisane przy użyciu tego samego klucza co dla Twojej aplikacji (np. pakietu 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 blobów danych
System reprezentuje każdy udostępniony blob danych za pomocą obiektu BlobHandle
. Każda instancja BlobHandle
zawiera zabezpieczony kryptograficznie hasz oraz pewne szczegóły identyfikujące zbiór danych.
Aby uzyskać dostęp do udostępnionych blobów danych, pobierz z serwera szczegóły identyfikacyjne. Korzystając z 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.
Zbiór danych jest dostępny
Jeśli zbiór danych jest już dostępny na urządzeniu, otwórz go z poziomu 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); } }