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