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