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