ซิงค์ข้อมูล

เอกสารนี้อธิบายวิธีซิงค์ข้อมูลระหว่างอุปกรณ์ Wear OS กับโทรศัพท์ ดูคำแนะนำโดยภาพรวมเกี่ยวกับกรณีที่ควรใช้ Data Layer API และกรณีที่ควรใช้โครงสร้างพื้นฐาน

ส่งและซิงค์ข้อมูลจากเครือข่ายโดยตรง

สร้างแอป Wear OS เพื่อสื่อสารกับเครือข่ายโดยตรง ใช้ API เดียวกันกับที่ใช้ในการพัฒนาแอปบนมือถือ แต่โปรดคำนึงถึงความแตกต่างบางอย่างที่เฉพาะเจาะจงสำหรับ Wear OS

ซิงค์ข้อมูลโดยใช้ Wear OS Data Layer API

DataClient จะแสดง API สำหรับคอมโพเนนต์เพื่ออ่านหรือเขียนไปยัง DataItem หรือ Asset

คุณตั้งค่ารายการข้อมูลและชิ้นงานได้ในขณะที่ไม่ได้เชื่อมต่อกับอุปกรณ์ใดๆ ระบบจะซิงค์รายการข้อมูลและชิ้นงานเมื่ออุปกรณ์สร้างการเชื่อมต่อเครือข่าย ข้อมูลนี้ เป็นข้อมูลส่วนตัวของแอปและแอปของคุณจะเข้าถึงได้ในอุปกรณ์อื่นๆ เท่านั้น

  • DataItemจะซิงค์กับอุปกรณ์ทั้งหมดในเครือข่าย Wear OS โดยทั่วไปแล้วจะมีขนาดเล็ก

  • ใช้ Asset เพื่อโอนออบเจ็กต์ขนาดใหญ่ขึ้น เช่น รูปภาพ ระบบ จะติดตามเนื้อหาที่โอนแล้วและ ขจัดข้อมูลที่ซ้ำกันโดยอัตโนมัติ

ฟังเหตุการณ์ในบริการ

ขยายคลาส WearableListenerService ระบบจะจัดการวงจรของWearableListenerServiceพื้นฐาน โดยจะเชื่อมโยงกับบริการเมื่อจำเป็นต้องส่งรายการข้อมูลหรือข้อความ และยกเลิกการเชื่อมโยงบริการเมื่อไม่จำเป็นต้องดำเนินการใดๆ

ฟังเหตุการณ์ในกิจกรรม

ใช้OnDataChangedListener อินเทอร์เฟซ ใช้อินเทอร์เฟซนี้แทน WearableListenerService เมื่อต้องการฟังการเปลี่ยนแปลงเฉพาะเมื่อผู้ใช้กำลังใช้แอปของคุณอยู่

description: โอนออบเจ็กต์ไบนารีขนาดใหญ่ เช่น รูปภาพ ระหว่างโทรศัพท์ Android กับนาฬิกา Wear OS โดยใช้เนื้อหาใน Data Layer API keywords_public: Wear OS, Data Layer API, เนื้อหา, การโอนข้อมูลผ่านบลูทูธ, การซิงค์ข้อมูล, DataMap, PutDataRequest

ซิงค์ข้อมูล

หากต้องการแชร์ออบเจ็กต์ไบนารีขนาดใหญ่ผ่านการรับส่งบลูทูธ เช่น บันทึกเสียงจากอุปกรณ์อื่น คุณสามารถแนบ Asset ไปยังรายการข้อมูล แล้วใส่รายการข้อมูลลงในที่เก็บข้อมูลที่จำลองได้

หมายเหตุ: Data Layer API สามารถส่งข้อความและซิงค์ข้อมูลได้เฉพาะกับ โทรศัพท์ที่ใช้ Android หรือนาฬิกา Wear OS เท่านั้น หากอุปกรณ์ Wear OS จับคู่กับ อุปกรณ์ iOS อยู่ Data Layer API จะไม่ทำงาน

ด้วยเหตุนี้ จึงไม่ควรใช้ Data Layer API เป็นวิธีหลักในการสื่อสารกับเครือข่าย แต่ให้ทำตามรูปแบบเดียวกันในแอป Wear OS เหมือนในแอปโทรศัพท์ โดยอาจมีความแตกต่างเล็กน้อยตามที่อธิบายไว้ในการเข้าถึงเครือข่ายและการซิงค์ใน Wear OS

เนื้อหาจะจัดการแคชของข้อมูลโดยอัตโนมัติเพื่อป้องกันการส่งซ้ำและเพื่อ ประหยัดแบนด์วิดท์บลูทูธ รูปแบบทั่วไปคือแอปในโทรศัพท์จะดาวน์โหลดรูปภาพ ย่อให้มีขนาดที่เหมาะสมเพื่อแสดงบนนาฬิกา และแชร์รูปภาพนั้น ไปยังแอปในนาฬิกาเป็นเนื้อหา ตัวอย่างต่อไปนี้แสดงให้เห็น รูปแบบนี้

โอนเนื้อหา

สร้างเนื้อหาโดยใช้วิธีใดวิธีหนึ่งใน create...() คลาส Asset แปลงบิตแมปเป็นอาร์เรย์ไบต์ แล้วเรียกใช้ createFromBytes() เพื่อสร้างเนื้อหาตามที่แสดงใน ตัวอย่างต่อไปนี้

private fun createAssetFromBitmap(bitmap: Bitmap): Asset =
    ByteArrayOutputStream().let { byteStream ->
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream)
        Asset.createFromBytes(byteStream.toByteArray())
    }

จากนั้นแนบชิ้นงานกับรายการข้อมูลโดยใช้putAsset()เมธอดใน DataMap หรือ PutDataRequest จากนั้นใส่รายการข้อมูลลงใน ที่เก็บข้อมูลโดยใช้เมธอด putDataItem() ดังที่แสดงใน ตัวอย่างต่อไปนี้

ตัวอย่างต่อไปนี้ใช้ PutDataRequest

private fun Context.sendImagePutDataRequest(): Task<DataItem> {

    val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk))
    val request: PutDataRequest = PutDataRequest.create("/image").apply {
        putAsset("profileImage", asset)
    }
    val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request)

    return putTask
}

ตัวอย่างต่อไปนี้ใช้ PutDataMapRequest

private fun Context.sendImagePutDataMapRequest(): Task<DataItem> {

    val asset: Asset = createAssetFromBitmap(BitmapFactory.decodeResource(resources, R.drawable.ic_walk))
    val request: PutDataRequest = PutDataMapRequest.create("/image").run {
        dataMap.putAsset("profileImage", asset)
        asPutDataRequest()
    }
    val putTask: Task<DataItem> = Wearable.getDataClient(this).putDataItem(request)

    return putTask
}

รับเนื้อหา

หลังจากสร้างชิ้นงานแล้ว โดยปกติคุณจะอ่านและแยกชิ้นงานที่อีกด้านหนึ่ง ของการเชื่อมต่อ ตัวอย่างต่อไปนี้แสดงวิธีใช้การเรียกกลับเพื่อ ตรวจหาการเปลี่ยนแปลงชิ้นงานและแยกชิ้นงาน

override fun onDataChanged(dataEvents: DataEventBuffer) {
    dataEvents
        .filter { it.type == DataEvent.TYPE_CHANGED && it.dataItem.uri.path == "/image" }
        .forEach { event ->
            val asset = DataMapItem.fromDataItem(event.dataItem)
                .dataMap.getAsset("profileImage")

            asset?.let { safeAsset ->
                lifecycleScope.launch {
                    val bitmap = loadBitmapFromAsset(safeAsset)
                    // Do something with the bitmap
                }
            }
        }
}

private suspend fun loadBitmapFromAsset(asset: Asset): Bitmap? = withContext(Dispatchers.IO) {
    try {
        val assetResult = Wearable.getDataClient(this@DataLayerActivity2)
            .getFdForAsset(asset)
            .await()

        assetResult?.inputStream?.use { inputStream ->
            BitmapFactory.decodeStream(inputStream)
        }
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

ดูข้อมูลเพิ่มเติมได้ที่โปรเจ็กต์ตัวอย่าง DataLayer ใน GitHub