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

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