ตั้งแต่ Android 11 (ระดับ API 30) เป็นต้นไป ระบบจะแคชชุดข้อมูลขนาดใหญ่ที่แอปหลายแอปอาจเข้าถึงสำหรับกรณีการใช้งานต่างๆ เช่น แมชชีนเลิร์นนิงและการเล่นสื่อ ฟังก์ชันนี้ช่วยลดความซ้ำซ้อนของข้อมูลทั้งในเครือข่ายและในดิสก์
เมื่อแอปต้องการเข้าถึงชุดข้อมูลขนาดใหญ่ที่แชร์ แอปจะค้นหาชุดข้อมูลที่แคชไว้เหล่านี้ก่อน ซึ่งเรียกว่า Blob ข้อมูลที่แชร์ ก่อนที่จะพิจารณาว่าจะดาวน์โหลดสำเนาใหม่หรือไม่ แอปสามารถเข้าถึงฟังก์ชันชุดข้อมูลที่แชร์เหล่านี้ได้โดยใช้ API ใน BlobStoreManager
ระบบจะเก็บรักษา Blob ข้อมูลที่แชร์และควบคุมว่าแอปใดบ้างที่เข้าถึง Blob ดังกล่าวได้ เมื่อแอปของคุณมีส่วนร่วมใน Blob ข้อมูล คุณสามารถระบุแอปอื่นๆ ที่ควรมีสิทธิ์เข้าถึงได้โดยเรียกใช้วิธีใดวิธีหนึ่งต่อไปนี้
- หากต้องการให้สิทธิ์เข้าถึงแอปบางชุดในอุปกรณ์ ให้ส่งชื่อแพ็กเกจของแอปเหล่านี้ไปยัง
allowPackageAccess() - หากต้องการอนุญาตเฉพาะแอปที่มีใบรับรองที่รับรองโดยใช้คีย์เดียวกับที่ใช้สำหรับแอปของคุณ เช่น ชุดแอปที่คุณจัดการ ให้เรียกใช้
allowSameSignatureAccess() - หากต้องการให้สิทธิ์เข้าถึงแอปทั้งหมดในอุปกรณ์ ให้เรียกใช้
allowPublicAccess()
เข้าถึง Blob ข้อมูลที่แชร์
ระบบจะแสดง Blob ข้อมูลที่แชร์แต่ละรายการโดยใช้ออบเจ็กต์ BlobHandle BlobHandle แต่ละรายการมีแฮชที่ปลอดภัยด้วยการเข้ารหัสและรายละเอียดการระบุบางอย่างสำหรับชุดข้อมูล
หากต้องการเข้าถึง Blob ข้อมูลที่แชร์ ให้ดาวน์โหลดรายละเอียดการระบุตัวตนจากเซิร์ฟเวอร์ ใช้รายละเอียดเหล่านี้เพื่อตรวจสอบว่าชุดข้อมูลมีอยู่ในระบบแล้วหรือไม่
ขั้นตอนถัดไปจะขึ้นอยู่กับว่ามีข้อมูลหรือไม่
มีชุดข้อมูล
หากชุดข้อมูลพร้อมใช้งานในอุปกรณ์แล้ว ให้เข้าถึงชุดข้อมูลจากระบบ ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
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); } }
ไม่มีชุดข้อมูล
หากชุดข้อมูลไม่พร้อมใช้งาน ให้ดาวน์โหลดจากเซิร์ฟเวอร์และส่งไปยังระบบ ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
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); } }