เริ่มตั้งแต่ 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); } }