เข้าถึงชุดข้อมูลที่แชร์

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