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

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