跳转到相应内容

最常访问

最近访问

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

此网站会使用 Cookie 来存储您在此网站上指定的语言和显示选项偏好设置。

获取最新的 Android Developers 资讯和提示,助您在 Google Play 上取得成功。

* 必填字段

成功!

在微信上关注 Google Developers

要以浏览此网站吗?

您请求访问的是网页,但是您为此网站设置的语言偏好为

要更改您的语言偏好设置并以浏览此网站吗?如果以后您想要更改语言偏好设置,请使用每个页面底部的语言菜单。

该类需要 或更高的 API 级别

此文档已被隐藏,因为您为该文档选择的 API 级别是 。您可以使用左侧导航栏上方的选择器来更改文档的 API 级别。

要详细了解如何根据您的应用需求指定 API 级别,请参阅支持不同平台版本

Take a short survey?
Help us improve the Android developer experience. (April 2018 — Developer Survey)