Android 11'den (API düzeyi 30) itibaren sistem, makine öğrenimi ve medya oynatma gibi kullanım alanlarında 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 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 blobları olarak adlandırılan bu önbelleğe alınmış veri kümelerini arayabilir. Uygulamalar, BlobStoreManager
'daki API'leri kullanarak bu paylaşılan veri kümeleri işlevine erişebilir.
Sistem, paylaşılan veri bloblarını korur ve hangi uygulamaların bunlara erişebileceğini kontrol eder. Uygulamanız veri blobları gönderdiğinde aşağıdaki yöntemlerden birini çağırarak hangi uygulamaların erişimi olması gerektiğini belirtebilirsiniz:
- Bir cihazda belirli bir uygulama grubuna erişim izni vermek için bu uygulamaların paket adlarını
allowPackageAccess()
'ye iletin. - Yalnızca sertifikaları uygulamanız için kullanılan anahtarla (ör. yönettiğiniz bir uygulama paketi) aynı anahtarla imzalanmış uygulamalara izin vermek için
allowSameSignatureAccess()
işlevini çağırın. - Bir cihazdaki tüm uygulamalara erişim izni vermek için
allowPublicAccess()
işlevini çağırın.
Paylaşılan veri blob'larına erişme
Sistem, paylaşılan her veri blob'unu bir BlobHandle
nesnesiyle temsil eder. BlobHandle
öğesinin her örneğinde, kriptografik olarak güvenli bir karma ve veri kümesiyle ilgili bazı tanımlayıcı ayrıntılar bulunur.
Paylaşılan veri blob'larına erişmek için tanımlayıcı ayrıntıları sunucudan indirin. Bu ayrıntıları kullanarak veri kümesinin sistemde mevcut olup olmadığını kontrol edin.
Sonraki adım, verilerin kullanılabilir olup olmamasına bağlıdır.
Veri kümesi kullanılabilir
Veri kümesi cihazda zaten varsa aşağıdaki kod snippet'inde gösterildiği gibi sisteme erişerek kullanabilirsiniz:
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 kullanılamıyorsa 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); } }