คุณส่งข้อความโดยใช้
MessageClient
API และแนบรายการต่อไปนี้ไปกับข้อความ
- เพย์โหลดที่ไม่บังคับ
- เส้นทางที่ระบุการดำเนินการของข้อความที่ไม่ซ้ำกัน
การซิงค์ระหว่างแอปในอุปกรณ์พกพาและแอปในอุปกรณ์ที่สวมใส่ได้จะไม่เกิดขึ้น ซึ่งต่างจากกรณีของรายการข้อมูล ข้อความคือกลไกการสื่อสารทางเดียวที่มีประโยชน์สำหรับการเรียกกระบวนการระยะไกล (RPC) เช่น การส่งข้อความไปยังอุปกรณ์ที่สวมใส่ได้เพื่อเริ่มกิจกรรม
คุณเชื่อมต่ออุปกรณ์ที่สวมใส่ได้หลายเครื่องกับอุปกรณ์ถือของผู้ใช้ได้ อุปกรณ์ที่เชื่อมต่อแต่ละเครื่องใน เครือข่ายจะถือเป็นโหนด
เมื่อมีอุปกรณ์หลายเครื่องที่เชื่อมต่ออยู่ คุณต้องพิจารณาว่า โหนดใดจะได้รับข้อความ ตัวอย่างเช่น ในแอปถอดเสียงที่รับข้อมูลเสียงในอุปกรณ์ที่สวมใส่ได้ ให้ส่งข้อความไปยังโหนดที่มีกำลังประมวลผลและความจุแบตเตอรี่เพื่อจัดการคำขอ เช่น อุปกรณ์พกพา
หมายเหตุ: เมื่อระบุรายละเอียดของข้อความ ให้พิจารณาความเป็นไปได้ที่จะมีโหนดที่เชื่อมต่อหลายรายการ ตรวจสอบว่าระบบส่งข้อความไปยังอุปกรณ์หรือโหนดที่ต้องการ
ดูตัวอย่างการใช้งานได้ในแอปตัวอย่างต่อไปนี้ DataLayer
ส่งข้อความ
แอปบนอุปกรณ์ที่สวมใส่ได้สามารถมอบฟังก์ชันการทำงานให้แก่ผู้ใช้ได้ เช่น การถอดเสียง ผู้ใช้สามารถพูดใส่ไมโครโฟนของอุปกรณ์ที่สวมใส่ได้และบันทึก ข้อความถอดเสียงลงในโน้ต เนื่องจากโดยปกติแล้วอุปกรณ์ที่สวมใส่ได้จะไม่มีกำลังประมวลผลและความจุแบตเตอรี่ ที่จำเป็นต่อการจัดการกิจกรรมการถอดเสียงเป็นคำ แอปจึงต้องส่งต่อการทำงานนี้ไปยังอุปกรณ์ที่เชื่อมต่อซึ่งมีความสามารถมากกว่า
ส่วนต่อไปนี้จะแสดงวิธีโฆษณาโหนดอุปกรณ์ที่ประมวลผลคำขอกิจกรรม ค้นหาโหนดที่ตอบสนองความต้องการที่ขอได้ และส่งข้อความไปยังโหนดเหล่านั้น
โฆษณาความสามารถ
หากต้องการเปิดกิจกรรมในอุปกรณ์ถือจากอุปกรณ์ที่สวมใส่ได้ ให้ใช้คลาส
MessageClient
เพื่อส่งคำขอ เนื่องจากอุปกรณ์สวมใส่หลายเครื่อง
เชื่อมต่อกับ
อุปกรณ์ถือได้ แอปอุปกรณ์สวมใส่จึงต้องพิจารณาว่าโหนดที่เชื่อมต่อ
สามารถเปิดใช้กิจกรรมได้ ในแอปแบบพกพา ให้โฆษณาว่าโหนด
ที่แอปทำงานอยู่มีความสามารถเฉพาะ
หากต้องการโฆษณาความสามารถของแอปบนอุปกรณ์ถือ ให้ทำดังนี้
- สร้างไฟล์การกำหนดค่า XML ในไดเรกทอรี
res/values/
ของโปรเจ็กต์และ ตั้งชื่อเป็นwear.xml
- เพิ่มแหล่งข้อมูลชื่อ
android_wear_capabilities
ไปยังwear.xml
- กำหนดความสามารถที่อุปกรณ์มี
หมายเหตุ: ความสามารถคือสตริงที่กำหนดเองซึ่งคุณกำหนดและต้องไม่ซ้ำกันภายในแอป
ตัวอย่างต่อไปนี้แสดงวิธีเพิ่มความสามารถชื่อ voice_transcription
ไปยัง
wear.xml
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@array/android_wear_capa<bilities"> string-array name="android_<wear_capabilities"&<gt; < item>voice_<transcription/item> /string-array> /resources>
เรียกข้อมูลโหนดที่มีความสามารถที่จำเป็น
ในตอนแรก คุณจะตรวจหาโหนดที่ใช้งานได้โดยเรียกใช้เมธอด
getCapability
ของคลาส
CapabilityClient
หากต้องการใช้วิธีนี้ แอป Wear OS และแอปโทรศัพท์
ต้องมีรหัสแอปพลิเคชันเดียวกัน ตัวอย่างต่อไปนี้แสดงวิธีดึงผลลัพธ์ของโหนดที่เข้าถึงได้ด้วยตนเองโดยใช้ความสามารถ voice_transcription
Kotlin
private const val VOICE_TRANSCRIPTION_CAPABILITY_NAME = "voice_transcription" ... private fun setupVoiceTranscription() { val capabilityInfo: CapabilityInfo = Tasks.await( Wearable.getCapabilityClient(context) .getCapability( VOICE_TRANSCRIPTION_CAPABILITY_NAME, CapabilityClient.FILTER_REACHABLE ) ) // capabilityInfo has the reachable nodes with the transcription capability updateTranscriptionCapability(capabilityInfo) }
Java
private static final String VOICE_TRANSCRIPTION_CAPABILITY_NAME = "voice_transcription"; ... private void setupVoiceTranscription() { CapabilityInfo capabilityInfo = Tasks.await( Wearable.getCapabilityClient(context).getCapability( VOICE_TRANSCRIPTION_CAPABILITY_NAME, CapabilityClient.FILTER_REACHABLE)); // capabilityInfo has the reachable nodes with the transcription capability updateTranscriptionCapability(capabilityInfo); }
ข้อควรระวัง:
ก่อนใช้ Wearable Data Layer API ให้ตรวจสอบว่า API นี้พร้อมใช้งานใน
อุปกรณ์หรือไม่ มิฉะนั้นจะเกิดข้อยกเว้น ใช้คลาส GoogleApiAvailability
ตามที่ใช้ใน Horologist
หากต้องการตรวจหาโหนดที่ใช้งานได้เมื่อเชื่อมต่อกับอุปกรณ์ที่สวมใส่ได้ ให้ลงทะเบียน
อินสแตนซ์ของ Listener โดยเฉพาะ OnCapabilityChangedListener
ของออบเจ็กต์ CapabilityClient
ตัวอย่างต่อไปนี้แสดงวิธี
ลงทะเบียน Listener และดึงผลลัพธ์ที่มีโหนดที่เข้าถึงได้ซึ่งมีความสามารถ voice_transcription
Kotlin
private fun setupVoiceTranscription() { updateTranscriptionCapability(capabilityInfo).also { capabilityListener -> Wearable.getCapabilityClient(context).addListener( capabilityListener, VOICE_TRANSCRIPTION_CAPABILITY_NAME ) } }
Java
private void setupVoiceTranscription() { ... // This example uses a Java 8 Lambda. You can use named or anonymous classes. CapabilityClient.OnCapabilityChangedListener capabilityListener = capabilityInfo -> { updateTranscriptionCapability(capabilityInfo); }; Wearable.getCapabilityClient(context).addListener( capabilityListener, VOICE_TRANSCRIPTION_CAPABILITY_NAME); }
หลังจากตรวจหาโหนดที่ใช้งานได้แล้ว ให้กำหนดตำแหน่งที่จะส่งข้อความ เลือกโหนด
ที่อยู่ใกล้กับอุปกรณ์ที่สวมใส่ได้เพื่อลด
การกำหนดเส้นทางข้อความผ่านหลายโหนด โหนดที่อยู่ใกล้เคียงคือโหนดที่เชื่อมต่อกับอุปกรณ์โดยตรง
หากต้องการตรวจสอบว่าโหนดอยู่ใกล้เคียงหรือไม่ เช่น เชื่อมต่อผ่านบลูทูธ ให้เรียกใช้เมธอด
Node.isNearby()
หากมีโหนดมากกว่า 1 โหนดอยู่ใกล้เคียง ให้เลือกโหนดใดก็ได้
ในทำนองเดียวกัน หากไม่มีโหนดที่ใช้งานได้อยู่ใกล้เคียง ให้เลือกโหนดที่ใช้งานได้โหนดใดก็ได้
ตัวอย่างต่อไปนี้แสดงวิธีพิจารณาโหนดที่ดีที่สุดที่จะใช้
Kotlin
private var transcriptionNodeId: String? = null private fun updateTranscriptionCapability(capabilityInfo: CapabilityInfo) { transcriptionNodeId = pickBestNodeId(capabilityInfo.nodes) } private fun pickBestNodeId(nodes: Set<Node>): String? { // Find a nearby node or pick one arbitrarily. return nodes.firstOrNull { it.isNearby }?.id ?: nodes.firstOrNull()?.id }
Java
private String transcriptionNodeId = null; private void updateTranscriptionCapability(CapabilityInfo capabilityInfo) { Set<Node> connectedNodes = capabilityInfo.getNodes(); transcriptionNodeId = pickBestNodeId(connectedNodes); } private String pickBestNodeId(Set<Node> nodes) { String bestNodeId = null; // Find a nearby node or pick one arbitrarily. for (Node node : nodes) { if (node.isNearby()) { return node.getId(); } bestNodeId = node.getId(); } return bestNodeId; }
ส่งข้อความ
เมื่อระบุโหนดที่จะใช้แล้ว ให้ส่งข้อความโดยใช้คลาส
MessageClient
ตัวอย่างต่อไปนี้แสดงวิธีส่งข้อความไปยังโหนดที่สามารถถอดเสียง จากอุปกรณ์ที่สวมใส่ได้ การเรียกนี้เป็นแบบซิงโครนัสและจะบล็อกการประมวลผลจนกว่า ระบบจะจัดคิวข้อความเพื่อนำส่ง
หมายเหตุ: รหัสผลลัพธ์ที่สำเร็จไม่ได้เป็นการรับประกันการนำส่ง
ข้อความ หากแอปของคุณต้องใช้ความน่าเชื่อถือของข้อมูล ให้พิจารณาใช้
DataItem
ออบเจ็กต์หรือคลาส ChannelClient
เพื่อส่งข้อมูลระหว่างอุปกรณ์
Kotlin
const val VOICE_TRANSCRIPTION_MESSAGE_PATH = "/voice_transcription" ... private fun requestTranscription(voiceData: ByteArray) { transcriptionNodeId?.also >{ nodeId - val send<T>ask: Task* = Wearable.getMessageClient(context).sendMessage( nodeId, VOICE_TRANSCRIPTION_MESSAGE_PATH, voiceData ).apply { addOnSuccessListener { ... } addOnFailureListener { ... } } } }
Java
public static final String VOICE_TRANSCRIPTION_MESSAGE_PATH = "/voice_transcription"; private void requestTranscription(byte[] voiceData) { if (transcriptionNodeId != null) { < T>askInteger sendTask = Wearable.getMessageClient(context).sendMessage( transcriptionNodeId, VOICE_TRANSCRIPTION_MESSAGE_PATH, voiceData); // You can add success and/or failure listeners, // Or you can call Tasks.await() and catch ExecutionException sendTask.addOnSuccessListener(...); sendTask.addOnFailureListener(...); } else { // Unable to retrieve node with transcription capability } }
หมายเหตุ: ดูข้อมูลเพิ่มเติมเกี่ยวกับการเรียกแบบอะซิงโครนัสและซิงโครนัสไปยัง บริการ Google Play รวมถึงเวลาที่ควรใช้แต่ละแบบได้ที่ Tasks API
นอกจากนี้ คุณยังสามารถออกอากาศข้อความไปยังโหนดที่เชื่อมต่อทั้งหมดได้ด้วย หากต้องการดึงข้อมูลโหนดที่เชื่อมต่อทั้งหมดที่คุณส่งข้อความถึงได้ ให้ใช้โค้ดต่อไปนี้
Kotlin
private fun getNodes(): Collection<String> { return Tasks.await(Wearable.getNodeClient(context).connectedNodes).map { it.id } }
Java
private Collection<String> getNodes() { HashSet <String>results = new HashSet<String>(); List<Node> nodes = Tasks.await(Wearable.getNodeClient(context).getConnectedNodes()); for (Node node : nodes.getNodes()) { results.add(node.getId()); } return results; }
รับข้อความ
หากต้องการรับการแจ้งเตือนเมื่อได้รับข้อความ ให้ใช้
MessageClient.OnMessageReceivedListener
อินเทอร์เฟซเพื่อระบุ Listener สำหรับเหตุการณ์ข้อความ จากนั้นลงทะเบียน Listener
ด้วยเมธอด addListener
ตัวอย่างต่อไปนี้แสดงวิธีใช้เครื่องมือตรวจสอบเพื่อตรวจสอบVOICE_TRANSCRIPTION_MESSAGE_PATH
หากเงื่อนไขนี้เป็น
true
ให้เริ่มกิจกรรมเพื่อประมวลผลข้อมูลเสียง
Kotlin
fun onMessageReceived(messageEvent: MessageEvent) { if (messageEvent.path == VOICE_TRANSCRIPTION_MESSAGE_PATH) { val startIntent = Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) putExtra("VOICE_DATA", messageEvent.data) } startActivity(this, startIntent) } }
Java
@Override public void onMessageReceived(MessageEvent messageEvent) { if (messageEvent.getPath().equals(VOICE_TRANSCRIPTION_MESSAGE_PATH)) { Intent startIntent = new Intent(this, MainActivity.class); startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startIntent.putExtra("VOICE_DATA", messageEvent.getData()); startActivity(this, startIntent); } }
โค้ดนี้ต้องมีรายละเอียดการติดตั้งใช้งานเพิ่มเติม ดูวิธี ใช้บริการหรือกิจกรรม Listener แบบเต็มใน รอรับเหตุการณ์ชั้นข้อมูล