Ab Android 11 (API-Level 30) speichert das System große Datasets im Cache, können mehrere Apps für Anwendungsfälle wie maschinelles Lernen und Medien zugreifen. Wiedergabe starten. Diese Funktion trägt dazu bei, die Datenredundanz sowohl über das Netzwerk als auch auf dem Laufwerk zu reduzieren.
Wenn Ihre App Zugriff auf ein freigegebenes großes Dataset benötigt, kann sie zuerst nach
diese im Cache gespeicherten Datasets, die als freigegebene Daten-BLOBs bezeichnet werden, bevor Sie bestimmen,
eine neue Kopie herunterladen. Apps können mithilfe von
APIs in BlobStoreManager
Das System verwaltet die freigegebenen Daten-BLOBs und steuert, auf welche Anwendungen Zugriff hat . Wenn Ihre App Datenblobs beisteuert, können Sie angeben, welche anderen Apps Zugriff haben sollen, indem Sie eine der folgenden Methoden aufrufen:
- Wenn du einer bestimmten Gruppe von Apps auf einem Gerät Zugriff gewähren möchtest, übergib die Paketnamen
dieser Apps in
allowPackageAccess()
- So lassen Sie nur Apps zu, deren Zertifikate mit demselben Schlüssel wie diese signiert sind
die für Ihre App verwendet werden, z. B. eine von Ihnen verwaltete App-Suite,
allowSameSignatureAccess()
- Wenn Sie allen Apps auf einem Gerät Zugriff gewähren möchten, rufen Sie
allowPublicAccess()
auf.
Auf freigegebene Daten-BLOBs zugreifen
Das System stellt jeden freigegebenen Datenblob mit einem BlobHandle
-Objekt dar. Jede Instanz von BlobHandle
enthält einen kryptografisch sicheren Hash und einige identifizierende Details für den Datensatz.
Wenn Sie auf freigegebene Daten-Blobs zugreifen möchten, laden Sie identifizierende Details vom Server herunter. Prüfen Sie anhand dieser Details, ob das Dataset bereits im System verfügbar ist.
Der nächste Schritt hängt davon ab, ob Daten verfügbar sind.
Dataset verfügbar
Wenn der Datensatz bereits auf dem Gerät verfügbar ist, greifen Sie vom System aus darauf zu. Dies wird im folgenden Code-Snippet gezeigt:
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); } }
Dataset nicht verfügbar
Wenn das Dataset nicht verfügbar ist, laden Sie es vom Server herunter und stellen Sie es bereit. an das System gesendet werden, wie im folgenden Code-Snippet gezeigt:
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); } }