เอกสารนี้อธิบายวิธีซิงค์ข้อมูลระหว่างอุปกรณ์ 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: Transfer large binary objects, such as images, between Android phones and Wear OS watches using Assets in the Data Layer API. keywords_public: Wear OS, Data Layer API, Assets, Bluetooth data transfer, data synchronization, DataMap, PutDataRequest
ซิงค์ข้อมูล
หากต้องการแชร์ออบเจ็กต์ไบนารีขนาดใหญ่ผ่านการรับส่งข้อมูล Bluetooth เช่น การบันทึกเสียง
จากอุปกรณ์อื่น คุณสามารถแนบ Asset กับรายการข้อมูล
แล้วใส่รายการข้อมูลลงใน Datastore ที่จำลองขึ้น อย่างไรก็ตาม หากเป็นการแลกเปลี่ยนแบบครั้งเดียวระหว่างอุปกรณ์ 2 เครื่องที่เชื่อมต่อกัน
ให้พิจารณาว่าการโอนโดยตรงที่ง่ายกว่าเหมาะสมกว่าหรือไม่
หมายเหตุ: Data Layer API สามารถส่งข้อความและซิงค์ข้อมูลกับโทรศัพท์ที่ใช้ Android หรือสมาร์ทวอทช์ Wear OS เท่านั้น หากอุปกรณ์ Wear OS จับคู่กับอุปกรณ์ iOS Data Layer API จะไม่ทำงาน
ด้วยเหตุนี้ จึงไม่ควรใช้ Data Layer API เป็นวิธีหลักในการสื่อสารกับเครือข่าย แต่ให้ทำตามรูปแบบเดียวกับในแอป Wear OS เช่นเดียวกับในแอปโทรศัพท์ โดยมีความแตกต่างเล็กน้อยตามที่อธิบายไว้ในหัวข้อการเข้าถึงเครือข่ายและการซิงค์ ใน Wear OS
เนื้อหาจะจัดการการแคชข้อมูลโดยอัตโนมัติเพื่อป้องกันการส่งซ้ำและประหยัดแบนด์วิดท์ Bluetooth รูปแบบที่ใช้กันทั่วไปคือแอปโทรศัพท์จะดาวน์โหลดรูปภาพ ย่อให้มีขนาดเหมาะสมที่จะแสดงในสมาร์ทวอทช์ แล้วแชร์ไปยังแอปสมาร์ทวอทช์เป็นเนื้อหา ตัวอย่างต่อไปนี้แสดงรูปแบบนี้
โอนเนื้อหา
สร้างเนื้อหาโดยใช้วิธีใดวิธีหนึ่งในเมธอด 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 }
รับเนื้อหา
หลังจากสร้างเนื้อหาแล้ว โดยปกติคุณจะอ่านและแยกเนื้อหาในอีกด้านหนึ่งของการเชื่อมต่อ ตัวอย่างต่อไปนี้แสดงวิธีใช้การเรียกกลับเพื่อตรวจหาการเปลี่ยนแปลงเนื้อหาและแยกเนื้อหา
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