Accedi a set di dati condivisi

A partire da Android 11 (livello API 30), il sistema memorizza nella cache grandi set di dati a cui più app potrebbero accedere per casi d'uso come il machine learning e la riproduzione di contenuti multimediali. Questa funzionalità aiuta a ridurre la ridondanza dei dati, sia sulla rete che su disco.

Quando la tua app ha bisogno di accedere a un set di dati condiviso di grandi dimensioni, può prima cercare questi set di dati memorizzati nella cache, denominati BLOB di dati condivisi, prima di decidere se scaricare una nuova copia. Le app possono accedere a queste funzionalità dei set di dati condivisi utilizzando le API in BlobStoreManager.

Il sistema gestisce i BLOB di dati condivisi e controlla le app che possono accedervi. Quando la tua app contribuisce ai BLOB di dati, puoi indicare a quali altre app devono avere accesso chiamando uno dei seguenti metodi:

  • Per concedere l'accesso a un insieme specifico di app su un dispositivo, trasmetti i nomi dei pacchetti delle app in allowPackageAccess().
  • Per consentire solo le app i cui certificati sono firmati con la stessa chiave usata per la tua app, ad esempio una suite di app che gestisci, chiama allowSameSignatureAccess().
  • Per concedere l'accesso a tutte le app su un dispositivo, chiama allowPublicAccess().

Accedi ai BLOB di dati condivisi

Il sistema rappresenta ogni BLOB di dati condiviso utilizzando un oggetto BlobHandle. Ogni istanza di BlobHandle contiene un hash con protezione crittografica e alcuni dettagli identificativi del set di dati.

Per accedere ai BLOB di dati condivisi, scarica i dettagli di identificazione dal server. Utilizzando questi dettagli, verifica se il set di dati è già disponibile nel sistema.

Il passaggio successivo dipende dalla disponibilità di dati.

Set di dati disponibile

Se il set di dati è già disponibile sul dispositivo, puoi accedervi dal sistema, come mostrato nel seguente snippet di codice:

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);
    }
}

Set di dati non disponibile

Se il set di dati non è disponibile, scaricalo dal server e invialo al sistema, come mostrato nel seguente snippet di codice:

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);
    }
}