Paylaşılan veri kümelerine erişme

Android 11'den (API düzeyi 30) itibaren sistem, 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ğda hem de diskte veri yedekliğ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 önce paylaşılan veri topakları olarak adlandırılan bu önbelleğe alınmış veri kümelerini arayabilir. Uygulamalar, BlobStoreManager'daki API'leri kullanarak bu ortak veri kümesi işlevlerine erişebilir.

Sistem, paylaşılan veri kümelerini korur ve hangi uygulamaların bunlara erişebileceğini kontrol eder. Uygulamanız veri topakları sağladığında aşağıdaki yöntemlerden birini çağırarak başka hangi uygulamaların erişmesi gerektiğini belirtebilirsiniz:

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

Paylaşılan veri öbeklerine erişme

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

Paylaşılan veri bloklarına erişmek için sunucudan kimlik bilgilerini indirin. Bu ayrıntıları kullanarak veri kümesinin sistemde mevcut olup olmadığını kontrol edin.

Sonraki adım, verilerin mevcut olup olmadığına bağlıdır.

Veri kümesi kullanılabilir

Veri kümesi cihazda zaten mevcutsa 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 aşağıdaki kod snippet'inde gösterildiği gibi sunucudan indirip 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);
    }
}