เอกสารนี้อธิบายวิธีซิงค์ข้อมูลระหว่างอุปกรณ์ 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 ไปกับรายการข้อมูล แล้วใส่รายการข้อมูลลงในพื้นที่เก็บข้อมูลที่จำลอง อย่างไรก็ตาม หากการแลกเปลี่ยนเป็นการแลกเปลี่ยนแบบครั้งเดียวระหว่างอุปกรณ์ 2 เครื่องที่เชื่อมต่อกัน
ให้พิจารณาว่าการโอนโดยตรงที่ง่ายกว่าเหมาะสมกว่าหรือไม่
หมายเหตุ: 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