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 Funktionalität reduziert die Datenredundanz sowohl über das Netzwerk als auch und auf der Festplatte.

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 mithilfe von APIs in BlobStoreManager

Das System verwaltet die freigegebenen Datenblobs und steuert, welche Apps darauf zugreifen können. Wenn Ihre Anwendung Daten-Blobs bereitstellt, können Sie angeben, welche anderen Apps Zugriff erhalten, 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()
  • Um Zugriff auf alle Apps auf einem Gerät zu gewähren, rufen Sie allowPublicAccess()

Auf freigegebene Daten-BLOBs zugreifen

Das System stellt jedes freigegebene Daten-Blob mithilfe eines BlobHandle-Objekt. Jede Instanz von BlobHandle enthält einen kryptografisch sicheren Hash und einige Details zur Identifizierung des Dataset.

Wenn Sie auf freigegebene Daten-Blobs zugreifen möchten, laden Sie die identifizierenden Details vom Server herunter. Mit prüfen Sie, 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 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);
    }
}