Skip to content

Most visited

Recently visited

navigation

发送和接收消息

使用 MessageApi 发送消息并将以下项目附到消息上:

与数据项目的情况不同,手持式设备应用和穿戴式设备应用之间不会进行同步。消息是一个单向通信机制,非常适用于远程过程调用 (RPC),如将消息发送到穿戴式设备以启动 Activity。

可将多个穿戴式设备连接到用户的手持式设备。网络中每个连接设备被视为一个节点。如有多个连接设备,则必须考虑哪些节点接收消息。例如,在穿戴式设备上接收语音数据的语音转录文字应用中,您应将消息发送到具有处理能力和电池容量的节点以处理请求,例如,手持式设备。

:对于 7.3.0 以前的 Google Play 服务版本,每次只能将一个穿戴式设备连接到手持式设备。您可能需要更新现有代码以将多个连接节点功能考虑在内。如果您不实现这些变更,您的消息可能无法传递到目标设备。

发送消息

穿戴式设备应用可以为用户提供语音转录文字等功能。用户可以对着他们的穿戴式设备的麦克风说话,并将转录文字保存到一个便签中。由于穿戴式设备通常不具有处理语音转录文字 Activity 所需的处理能力和电池容量,因此,应用应将此工作分流到能力更强的已连接设备上。

以下部分向您介绍如何公布可处理 Activity 请求的设备节点,探索能够满足需求的节点,并将消息发送到这些节点。

公布功能

要从穿戴式设备启动手持式设备上的 Activity,可使用 MessageApi 类发送请求。由于可将多个穿戴式设备连接到手持式设备,因此,穿戴式设备应用需要确定连接的节点是否能够启动 Activity。在手持式设备应用中,公布运行它的节点所提供的特定功能。

要公布手持式设备应用的功能,请执行以下操作:

  1. 在项目的 res/values/ 目录中创建一个 XML 配置文件,并将其命名为 wear.xml
  2. 将一个名为 android_wear_capabilities 的资源添加到 wear.xml
  3. 定义设备提供的功能。

:功能是您定义的自定义字符串,且在应用中必须是唯一的。

以下示例说明如何将一个名为 voice_transcription 的功能添加到 wear.xml

<resources>
    <string-array name="android_wear_capabilities">
        <item>voice_transcription</item>
    </string-array>
</resources>

通过所需的功能检索节点

首先,您可以通过调用 CapabilityApi.getCapability() 函数检测能够胜任的节点。以下示例说明如何通过 voice_transcription 功能手动检索可到达节点的结果:

private static final String
        VOICE_TRANSCRIPTION_CAPABILITY_NAME = "voice_transcription";

private GoogleApiClient mGoogleApiClient;

...

private void setupVoiceTranscription() {
    CapabilityApi.GetCapabilityResult result =
            Wearable.CapabilityApi.getCapability(
                    mGoogleApiClient, VOICE_TRANSCRIPTION_CAPABILITY_NAME,
                    CapabilityApi.FILTER_REACHABLE).await();

    updateTranscriptionCapability(result.getCapability());
}

要在节点连接到穿戴式设备时检测能够胜任的节点,可将 CapabilityApi.CapabilityListener() 实例注册到 GoogleApiClient。以下示例说明如何注册侦听器和通过 voice_transcription 功能检索可到达节点的结果:

private void setupVoiceTranscription() {
    ...

    CapabilityApi.CapabilityListener capabilityListener =
            new CapabilityApi.CapabilityListener() {
                @Override
                public void onCapabilityChanged(CapabilityInfo capabilityInfo) {
                    updateTranscriptionCapability(capabilityInfo);
                }
            };

    Wearable.CapabilityApi.addCapabilityListener(
            mGoogleApiClient,
            capabilityListener,
            VOICE_TRANSCRIPTION_CAPABILITY_NAME);
}

:如果您创建一项扩展 WearableListenerService 的 Service 以检测功能变化,您可能需要重写 onConnectedNodes() 函数以侦听更详细的连接详情,如穿戴式设备从 WLAN 切换到手持式设备的蓝牙连接时。如需了解如何侦听重要 Event 的详细信息,请参阅侦听数据层 Event

检测到胜任的节点后,确定在何处发送消息。您应选取一个临近穿戴式设备的节点,以最大限度减少消息通过多个节点传递的情况。附近节点的定义是:可直接连接到设备的节点。要确定节点是否位于附近,可调用 Node.isNearby() 函数。

以下示例说明如何确定要使用的最佳节点:

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;
}

传递消息

在确定要使用的最佳节点后,使用 MessageApi 类发送此消息。

以下示例说明如何从穿戴式设备将消息发送到可以转录文字的节点。在尝试发送消息前验证此节点是否可用。此调用同步并阻止处理,直到系统将要传递的消息排队。

:成功的结果代码不能保证消息的传递。如果应用需要数据可靠性,则考虑使用 DataItem 对象或 ChannelApi 类在设备间发送数据。


public static final String VOICE_TRANSCRIPTION_MESSAGE_PATH = "/voice_transcription";

private void requestTranscription(byte[] voiceData) {
    if (transcriptionNodeId != null) {
        Wearable.MessageApi.sendMessage(googleApiClient, transcriptionNodeId,
            VOICE_TRANSCRIPTION_MESSAGE_PATH, voiceData).setResultCallback(
                  new ResultCallback() {
                      @Override
                      public void onResult(SendMessageResult sendMessageResult) {
                          if (!sendMessageResult.getStatus().isSuccess()) {
                              // Failed to send message
                          }
                      }
                  }
            );
    } else {
        // Unable to retrieve node with transcription capability
    }
}

:如需了解有关异步和同步调用 Google Play 服务以及何时使用哪个调用的详细信息,请参阅与 Google Play 服务通信

您还可以向所有连接节点广播消息。要检索您可以向其发送消息的所有连接节点,请实现以下代码:

private Collection<String> getNodes() {
    HashSet <String>results = new HashSet<String>();
    NodeApi.GetConnectedNodesResult nodes =
            Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
    for (Node node : nodes.getNodes()) {
        results.add(node.getId());
    }
    return results;
}

接收消息

要收到已接收消息的通知,请实现 MessageListener 接口以提供消息 Event 的侦听器。然后,通过 MessageApi.addListener() 函数注册此侦听器。此示例展示如何实现侦听器以检查 VOICE_TRANSCRIPTION_MESSAGE_PATH。如果此条件为 true,则启动一个 Activity 来处理语音数据。

@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(startIntent);
    }
}

这只是一个需要更多实现详情的代码段。要了解如何实现完整的侦听器 Service 或 Activity,请查看侦听数据层 Event

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)