Auf freigegebene Datasets zugreifen

Ab Android 11 (API-Level 30) werden große Datensätze, auf die mehrere Apps für Anwendungsfälle wie maschinelles Lernen und Medienwiedergabe zugreifen können, im Cache des Systems gespeichert. Diese Funktion trägt dazu bei, die Datenredundanz sowohl über das Netzwerk als auch auf dem Laufwerk zu reduzieren.

Wenn Ihre App auf einen freigegebenen großen Datensatz zugreifen muss, kann sie zuerst nach diesen im Cache gespeicherten Datensätzen suchen, die als freigegebene Daten-Blobs bezeichnet werden, bevor sie entscheidet, ob eine neue Kopie heruntergeladen werden soll. Apps können über die APIs in BlobStoreManager auf diese Funktionen für freigegebene Datensätze zugreifen.

Das System verwaltet die freigegebenen Datenblobs und steuert, welche Apps darauf zugreifen können. Wenn Ihre App Datenblobs beisteuert, können Sie angeben, welche anderen Apps Zugriff haben sollen, indem Sie eine der folgenden Methoden aufrufen:

  • Wenn Sie Zugriff auf eine bestimmte Gruppe von Apps auf einem Gerät gewähren möchten, geben Sie die Paketnamen dieser Apps an allowPackageAccess() weiter.
  • Wenn Sie nur Apps zulassen möchten, deren Zertifikate mit demselben Schlüssel wie der für Ihre App signiert sind, 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 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 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 der Datensatz nicht verfügbar ist, laden Sie ihn vom Server herunter und fügen Sie ihn 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);
    }
}