Dostęp do udostępnionych zbiorów danych

Począwszy od Androida 11 (poziom interfejsu API 30) system buforuje duże zbiory danych, do których może mieć dostęp wiele aplikacji na potrzeby systemów uczących się i odtwarzania multimediów. Ta funkcja pomaga ograniczyć nadmiarowość danych zarówno w sieci, jak i na dysku.

Gdy aplikacja potrzebuje dostępu do udostępnionego dużego zbioru danych, przed podjęciem decyzji o pobraniu nowej kopii może najpierw poszukać w pamięci podręcznej zbiorów danych nazywanych udostępnionymi obiektami blobów danych. Aplikacje mogą korzystać z funkcji udostępnianych zbiorów danych za pomocą interfejsów API w BlobStoreManager.

System utrzymuje udostępnione bloby danych i kontroluje, które aplikacje mają do nich 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, przekaż nazwy pakietów tych aplikacji do usługi allowPackageAccess().
  • Aby zezwolić tylko na aplikacje, których certyfikaty są podpisane przy użyciu tego samego klucza co dla Twojej aplikacji (np. pakietu aplikacji, którym zarządzasz), wywołaj allowSameSignatureAccess().
  • Aby przyznać dostęp do wszystkich aplikacji na urządzeniu, wywołaj allowPublicAccess().

Dostęp do udostępnionych blobów danych

System reprezentuje każdy udostępniony blob danych za pomocą obiektu BlobHandle. Każda instancja BlobHandle zawiera zabezpieczony kryptograficznie hasz oraz pewne szczegóły identyfikujące zbiór danych.

Aby uzyskać dostęp do udostępnionych blobów danych, pobierz z serwera szczegóły identyfikacyjne. Korzystając z tych informacji, sprawdź, czy zbiór danych jest już dostępny w systemie.

Następny 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 z poziomu systemu, jak pokazano 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 przekaż 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);
    }
}