Ab Android 11 (API-Level 30) werden große Datasets vom System im Cache gespeichert, auf die mehrere Apps für Anwendungsfälle wie maschinelles Lernen und Medienwiedergabe zugreifen können. Diese Funktion trägt dazu bei, die Datenredundanz sowohl im Netzwerk als auch auf der Festplatte zu reduzieren.
Wenn Ihre App Zugriff auf ein freigegebenes großes Dataset benötigt, kann sie zuerst nach diesen im Cache gespeicherten Datasets suchen, die als freigegebene Daten-Blobs bezeichnet werden. Anschließend wird entschieden, ob eine neue Kopie heruntergeladen werden soll. Apps können über
die APIs in BlobStoreManager auf diese Funktion für freigegebene Datasets zugreifen.
Das System verwaltet die weitergegebenen Daten-Blobs und steuert, welche Apps darauf zugreifen können. Wenn Ihre App Daten-Blobs beiträgt, können Sie angeben, welche anderen Apps Zugriff haben sollen. Rufen Sie dazu eine der folgenden Methoden auf:
- Wenn Sie einer bestimmten Gruppe von Apps auf einem Gerät Zugriff gewähren möchten, übergeben Sie die Paketnamen
dieser Apps an
allowPackageAccess(). - Wenn nur Apps zugelassen werden sollen, deren Zertifikate mit demselben Schlüssel signiert sind wie der für Ihre App verwendete Schlüssel, z. B. eine von Ihnen verwaltete App-Suite, rufen Sie
allowSameSignatureAccess()auf. - Wenn Sie allen Apps auf einem Gerät Zugriff gewähren möchten, rufen Sie
allowPublicAccess()auf.
Auf weitergegebene Daten-Blobs zugreifen
Das System stellt jeden weitergegebenen Daten-Blob mit einem
BlobHandle-Objekt dar. Jede Instanz von BlobHandle enthält einen kryptografisch sicheren Hash und einige identifizierende Details für das Dataset.
Wenn Sie auf weitergegebene Daten-Blobs zugreifen möchten, laden Sie die identifizierenden 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 das Dataset bereits auf dem Gerät verfügbar ist, greifen Sie wie im folgenden Code-Snippet gezeigt über das System darauf zu:
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 tragen Sie es wie im folgenden Code-Snippet gezeigt zum System bei:
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); } }