Dostęp do udostępnionych zbiorów danych

Począwszy od Androida 11 (poziom API 30) system przechowuje w pamięci podręcznej duże zbiory danych, do których może mieć dostęp wiele aplikacji w przypadku takich zastosowań jak systemy uczące się i odtwarzanie multimediów. Ta funkcja pomaga ograniczyć nadmiarowość danych, zarówno w sieci, i na dysku.

Gdy aplikacja potrzebuje dostępu do udostępnionego dużego zbioru danych, może najpierw poszukać te zbiory danych w pamięci podręcznej, nazywane udostępnionymi blobami danych, przed określeniem, czy pobierz nową kopię. Aplikacje mogą uzyskać dostęp do funkcji udostępnianych zbiorów danych za pomocą interfejsów API w projekcie BlobStoreManager.

System utrzymuje udostępnione bloby danych i kontroluje, które aplikacje mają dostęp . Gdy Twoja aplikacja udostępnia bloby danych, możesz wskazać, które inne aplikacje powinny mieć do nich dostęp, wywołując jedną z tych metod:

  • Aby przyznać dostęp do określonego zestawu aplikacji na urządzeniu, prześlij nazwy pakietów tych aplikacji do allowPackageAccess().
  • Zezwalanie tylko na aplikacje, których certyfikaty są podpisane tym samym kluczem co ten klucz używane w Twojej aplikacji (np. z pakietem aplikacji, którym zarządzasz), allowSameSignatureAccess()
  • Aby przyznać dostęp do wszystkich aplikacji na urządzeniu, wywołaj allowPublicAccess()

Dostęp do wspólnych obiektów danych

System reprezentuje każdy udostępniony blob danych za pomocą BlobHandle. Każde wystąpienie instancji BlobHandle zawiera zabezpieczony kryptograficznie hasz oraz niektóre szczegóły identyfikujące w gromadzeniu danych.

Aby uzyskać dostęp do udostępnionych bloków danych, pobierz z serwera szczegóły identyfikacyjne. Zastosowanie sprawdź, czy zbiór danych jest już dostępny w systemie.

Kolejny krok zależy od tego, czy dane są dostępne.

Zbiór danych jest dostępny

Jeśli zbiór danych jest już dostępny na urządzeniu, otwórz go w systemie Jak widać w tym fragmencie kodu:

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

Zbiór danych niedostępny

Jeśli zbiór danych jest niedostępny, pobierz go z serwera i prześlij do systemu, jak pokazano w tym fragmencie kodu:

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