ส่งและรับข้อความบน Wear

คุณส่งข้อความโดยใช้ MessageClient API และแนบรายการต่อไปนี้ไปกับข้อความ

  • เพย์โหลดที่กำหนดเองที่ไม่บังคับ
  • เส้นทางที่ระบุการทำงานของข้อความที่ไม่ซ้ำกัน

ซึ่งต่างจากในกรณีของรายการข้อมูล จะไม่มีการซิงค์เกิดขึ้นระหว่าง แอปแบบพกพาและอุปกรณ์ที่สวมใส่ได้ ข้อความเป็นกลไกการสื่อสารทางเดียวซึ่งมีประโยชน์สำหรับการเรียกใช้โพรซีเยอร์ระยะไกล (RPC) เช่น การส่งข้อความไปยังอุปกรณ์ที่สวมใส่ได้เพื่อเริ่มกิจกรรม

อุปกรณ์ที่สวมใส่ได้หลายเครื่องสามารถเชื่อมต่อกับอุปกรณ์เคลื่อนที่ของผู้ใช้ได้ อุปกรณ์ที่เชื่อมต่อแต่ละเครื่องใน เครือข่ายนั้นจะถือว่าเป็นโหนด

หากมีอุปกรณ์เชื่อมต่อหลายเครื่อง คุณต้องพิจารณาว่าอุปกรณ์ใด โหนดจะได้รับข้อความ ตัวอย่างเช่น ในแอปการถอดเสียงเป็นคำที่รับข้อมูลเสียงใน อุปกรณ์ที่สวมใส่ได้ ส่งข้อความไปยังโหนดที่มีกำลังในการประมวลผลและแบตเตอรี่ ความสามารถในการจัดการคำขอ เช่น อุปกรณ์พกพา

หมายเหตุ เมื่อคุณระบุรายละเอียดของข้อความ ให้คำนึงถึงความเป็นไปได้ที่ ที่เชื่อมต่ออยู่ ตรวจสอบว่าส่งข้อความไปยังอุปกรณ์หรือโหนดที่ต้องการ

ดูตัวอย่างการใช้แอปต่อไปนี้ ชั้นข้อมูล

ส่งข้อความ

แอปสำหรับอุปกรณ์สวมใส่สามารถให้บริการฟังก์ชันการทำงานสำหรับผู้ใช้ เช่น เสียง การถอดเสียงเป็นคำ ผู้ใช้สามารถพูดใส่ไมโครโฟนของอุปกรณ์ที่สวมใส่ได้และถอดเสียงได้ บันทึกลงในโน้ตแล้ว เนื่องจากอุปกรณ์ที่สวมใส่ได้มักจะไม่มีกำลังในการประมวลผลและแบตเตอรี่ ขีดจำกัดที่ต้องใช้ในการจัดการกับกิจกรรมการถอดความเสียง แอปจำเป็นต้องนำงานนี้ออกไปยัง มีความสามารถมากขึ้น

ส่วนต่อไปนี้จะแสดงวิธีโฆษณาโหนดอุปกรณ์ที่สามารถประมวลผลกิจกรรมได้ ค้นหาโหนดที่สามารถตอบสนองความต้องการที่ขอ และส่งข้อความไปยัง

หากต้องการเริ่มต้นกิจกรรมในอุปกรณ์พกพาจากอุปกรณ์ที่สวมใส่ได้ ให้ใช้ MessageClient ชั้นเรียนเพื่อส่งคำขอ เนื่องจากมีอุปกรณ์ที่สวมใส่ได้หลายรายการ สามารถเชื่อมต่อกับ อุปกรณ์เคลื่อนที่ แอปอุปกรณ์ที่สวมใส่ได้จะต้องระบุว่าโหนดที่เชื่อมต่อ สามารถเริ่มใช้กิจกรรมได้ ในแอปมือถือ ให้โฆษณาว่าโหนด โมเดลจะทำงานเพื่อให้ความสามารถที่เฉพาะเจาะจง

หากต้องการโฆษณาความสามารถของแอปแบบพกพา ให้ทำดังนี้

  1. สร้างไฟล์การกำหนดค่า XML ในไดเรกทอรี res/values/ ของโปรเจ็กต์และ ตั้งชื่อว่า wear.xml
  2. เพิ่มทรัพยากรชื่อ android_wear_capabilities ใน wear.xml
  3. กำหนดความสามารถที่อุปกรณ์มีให้

หมายเหตุ ความสามารถคือสตริงที่กำหนดเองซึ่งคุณเป็นผู้กำหนดและต้องไม่ซ้ำกันภายในแอป

ตัวอย่างต่อไปนี้แสดงวิธีเพิ่มความสามารถชื่อ voice_transcription ไปยัง wear.xml:

<resources xmlns:tools="http://schemas.android.com/tools"
           tools:keep="@array/android_wear_capabilities">
    <string-array name="android_wear_capabilities">
        <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);
}

ในการตรวจหาโหนดที่รองรับขณะที่เชื่อมต่อกับอุปกรณ์ที่สวมใส่ได้ ให้ลงทะเบียน ของผู้ฟัง โดยเฉพาะ 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 โหนดอยู่ใกล้เคียง ให้เลือก 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 sendTask: 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) {
        Task<Integer> 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 ตัวอย่างต่อไปนี้แสดงวิธีใช้งาน Listener เพื่อตรวจสอบ 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);
    }
}

โค้ดนี้ต้องมีรายละเอียดการใช้งานเพิ่มเติม ดูข้อมูลเกี่ยวกับ วิธีใช้บริการหรือกิจกรรมสำหรับผู้ฟังโดยสมบูรณ์ใน ติดตามเหตุการณ์ชั้นข้อมูล