ซิงค์ข้อมูล

เอกสารนี้อธิบายวิธีซิงค์ข้อมูลระหว่างอุปกรณ์ 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
}

รับชิ้นงาน

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

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