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