Paylaşılan veri kümelerine erişme

Sistem, Android 11'den (API düzeyi 30) itibaren makine öğrenimi ve medya oynatma gibi kullanım alanları için birden fazla uygulamanın erişebileceği büyük veri kümelerini önbelleğe alır. Bu işlev hem ağ üzerinde hem de disk üzerinde veri yedekliliğini azaltmaya yardımcı olur.

Uygulamanızın paylaşılan büyük bir veri kümesine erişmesi gerektiğinde, yeni bir kopya indirip indirmeyeceğini belirlemeden önce, paylaşılan veri blob'ları adı verilen bu önbelleğe alınmış veri kümelerini arayabilir. Uygulamalar, BlobStoreManager'teki API'leri kullanarak bu paylaşılan veri kümesi işlevlerine erişebilir.

Sistem, paylaşılan veri blob'larını tutar ve hangi uygulamaların bunlara erişebileceğini kontrol eder. Uygulamanız veri blob'larına katkıda bulunduğunda, aşağıdaki yöntemlerden birini çağırarak başka hangi uygulamaların erişebilmesi gerektiğini belirtebilirsiniz:

  • Bir cihazda belirli bir uygulama grubuna erişim izni vermek için bu uygulamaların paket adlarını allowPackageAccess()'e iletin.
  • Yalnızca sertifikaları, uygulamanız için kullanılanla aynı anahtar kullanılarak imzalanan uygulamalara (ör. yönettiğiniz bir uygulama paketi) izin vermek için allowSameSignatureAccess() numaralı telefonu arayın.
  • Bir cihazdaki tüm uygulamalara erişim izni vermek için allowPublicAccess() numaralı telefonu arayın.

Paylaşılan veri blob'larına erişme

Sistem, bir BlobHandle nesnesi kullanarak paylaşılan her veri blobunu temsil eder. Her BlobHandle örneği, kriptografik olarak güvenli bir karma ve veri kümesi için bazı tanımlayıcı ayrıntılar içerir.

Paylaşılan veri blob'larına erişmek için sunucudan tanımlayıcı ayrıntıları indirin. Bu ayrıntıları kullanarak veri kümesinin sistemde zaten kullanılabilir olup olmadığını kontrol edin.

Bir sonraki adım, verilerin kullanılabilir olup olmamasına bağlıdır.

Veri kümesi mevcut

Veri kümesi cihazda zaten mevcutsa veri kümesine aşağıdaki kod snippet'inde gösterildiği gibi sistemden erişin:

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

Veri kümesi kullanılamıyor

Veri kümesi mevcut değilse sunucudan indirin ve aşağıdaki kod snippet'inde gösterildiği gibi sisteme katkıda bulunun:

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