Acessar conjuntos de dados compartilhados

A partir do Android 11 (API de nível 30), o sistema armazena em cache grandes conjuntos de dados que vários apps podem acessar para casos de uso como aprendizado de máquina e reprodução de mídia. Essa funcionalidade ajuda a reduzir a redundância de dados tanto na rede quanto no disco.

Quando o app precisar acessar um grande conjunto de dados compartilhados, ele vai pode procurar esses conjuntos em cache, chamados blobs de dados compartilhados, antes de determinar se vai fazer o download de uma nova cópia. Os apps podem acessar essa funcionalidade de conjuntos de dados compartilhados usando as APIs em BlobStoreManager.

O sistema mantém os blobs de dados compartilhados e controla os apps que podem acessá-los. Quando o app contribui com blobs de dados, é possível indicar que outros apps vão ter acesso chamando um destes métodos:

  • Para conceder acesso a um conjunto específico de apps em um dispositivo, transmita os nomes dos pacotes desses apps para allowPackageAccess().
  • A fim de permitir que apenas os apps com certificados assinados com a mesma chave usada para o app, por exemplo, um pacote de apps gerenciado por você, chame allowSameSignatureAccess().
  • Para conceder acesso a todos os apps em um dispositivo, chame allowPublicAccess().

Acessar blobs de dados compartilhados

O sistema representa cada blob de dados compartilhados usando um objeto BlobHandle. Cada instância de BlobHandle contém um hash criptograficamente seguro e alguns detalhes de identificação para o conjunto de dados.

Para acessar blobs de dados compartilhados, faça o download dos detalhes de identificação do servidor. Com esses detalhes, verifique se o conjunto de dados já está disponível no sistema.

A próxima etapa depende da disponibilidade dos dados.

Conjunto de dados disponível

Se o conjunto de dados já estiver disponível no dispositivo, acesse-o no sistema, como mostrado no snippet de código a seguir:

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

Conjunto de dados indisponível

Se o conjunto de dados não estiver disponível, faça o download dele no servidor e contribua com o sistema, como mostrado no snippet de código a seguir:

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