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