A partire da Android 11 (livello API 30), il sistema memorizza nella cache grandi set di dati che più app potrebbero accedere per casi d'uso come machine learning e contenuti multimediali per riprodurre un video. Questa funzionalità consente di ridurre la ridondanza dei dati, sia sulla rete e su disco.
Quando la tua app ha bisogno di accedere a un set di dati di grandi dimensioni condiviso, può prima cercare
questi set di dati memorizzati nella cache, chiamati BLOB di dati condivisi, prima di determinare se
scarica una nuova copia. Le app possono accedere alla funzionalità dei set di dati condivisi utilizzando
le API in BlobStoreManager
.
Il sistema conserva i BLOB di dati condivisi e controlla a quali app possono accedere che li rappresentano. Quando la tua app contribuisce BLOB di dati, puoi indicare quali altre app dovrebbe avere accesso chiamando uno dei seguenti metodi:
- Per concedere l'accesso a un insieme specifico di app su un dispositivo, trasmetti i nomi dei pacchetti
di queste app
allowPackageAccess()
- Per consentire solo le app i cui certificati sono firmati utilizzando la stessa chiave di quella utilizzata per la tua app, ad esempio una suite di app che gestisci, chiama
allowSameSignatureAccess()
. - Per concedere l'accesso a tutte le app di un dispositivo, chiama
allowPublicAccess()
Accedi ai BLOB di dati condivisi
Il sistema rappresenta ogni blob di dati condiviso utilizzando un
BlobHandle
. Ogni istanza di BlobHandle
contiene un hash con protezione crittografica e alcuni dettagli identificativi per il
del set di dati.
Per accedere ai BLOB di dati condivisi, scarica i dettagli identificativi dal server. Utilizzo a questi dettagli, controlla se il set di dati è già disponibile nel sistema.
Il passaggio successivo dipende dalla disponibilità dei dati.
Set di dati disponibile
Se il set di dati è già disponibile sul dispositivo, accedi dal sistema come mostrato nello snippet di codice riportato di seguito:
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); } }
Set di dati non disponibile
Se il set di dati non è disponibile, scaricalo dal server e contribuisci con esso al sistema, come mostrato nello snippet di codice seguente:
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); } }