Auf freigegebene Datasets zugreifen

Ab Android 11 (API-Level 30) speichert das System große Datasets im Cache, auf die mehrere Apps für Anwendungsfälle wie maschinelles Lernen und Medienwiedergabe zugreifen könnten. Diese Funktion reduziert die Datenredundanz sowohl im Netzwerk als auch auf der Festplatte.

Wenn die Anwendung Zugriff auf ein freigegebenes großes Dataset benötigt, kann sie zuerst nach diesen im Cache gespeicherten Datasets, sogenannten freigegebenen Daten-Blobs, suchen, bevor sie ermittelt, ob eine neue Kopie heruntergeladen werden soll. Anwendungen können über die APIs in BlobStoreManager auf diese Funktionen für freigegebene Datasets zugreifen.

Das System verwaltet die freigegebenen Daten-Blobs und steuert, welche Anwendungen darauf zugreifen können. Wenn Ihre Anwendung Daten-Blobs bereitstellt, können Sie mit einer der folgenden Methoden angeben, welche anderen Anwendungen Zugriff haben sollen:

  • Wenn Sie Zugriff auf eine bestimmte Gruppe von Apps auf einem Gerät gewähren möchten, übergeben Sie die Paketnamen dieser Apps an allowPackageAccess().
  • Wenn Sie nur Apps zulassen möchten, deren Zertifikate mit demselben Schlüssel signiert sind, der für Ihre Anwendung verwendet wird, z. B. eine von Ihnen verwaltete App-Suite, rufen Sie allowSameSignatureAccess() auf.
  • Wenn Sie Zugriff auf alle Apps auf einem Gerät gewähren möchten, rufen Sie allowPublicAccess() auf.

Auf freigegebene Daten-Blobs zugreifen

Das System stellt jeden freigegebenen Daten-Blob mithilfe eines BlobHandle-Objekts dar. Jede Instanz von BlobHandle enthält einen kryptografisch sicheren Hash und einige identifizierende Details für das Dataset.

Laden Sie identifizierende Details vom Server herunter, um auf freigegebene Daten-Blobs zuzugreifen. 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.

Datensatz verfügbar

Wenn das Dataset bereits auf dem Gerät verfügbar ist, greifen Sie wie im folgenden Code-Snippet ü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 fügen Sie es dem System hinzu, 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);
    }
}