在 Wear OS 上发送和同步数据

借助 Wear OS by Google 谷歌,手表可以通过多种方式发送和同步数据。我们建议您直接通过网络发送和同步数据,因为这样做可以使该应用被视为独立应用。

直接通过网络发送和同步数据

构建 Wear OS 应用以直接与网络通信。您可以使用用于移动开发的相同 API,但需要注意一些特定于 Wear OS 的差异。

使用 Wearable Data Layer API 发送和同步数据

Wearable Data Layer API(Google Play 服务的一部分)为应用提供了一个可选的通信通道。

此 API 仅适用于 Wear OS 手表和配对的 Android 设备。 对于与 iOS 手机配对的 Wear OS 手表,在有互联网连接的情况下,应用可以查询其他云端 API。

Wearable Data Layer API 的依赖项如下:

请在 Wear 模块的 build.gradle 文件中添加以下依赖项:

  dependencies {
    ...
    implementation 'com.google.android.gms:play-services-wearable:18.1.0'
  }
  

我们建议穿戴式设备应用直接通过网络或所连接的手机来发送和同步数据。不过,如果您想采用 RPC 类型的形式在设备之间直接通信,或无法直接连接到网络以获取数据,可以通过以下方式使用 Wearable Data Layer API。

通告和查询远程功能
CapabilityClient 会提供有关 Wear OS 网络上的哪些节点支持哪些自定义应用功能的信息。节点表示已连接到网络的移动设备和穿戴式设备。功能是应用在构建时定义或在运行时动态配置的功能。
例如,某个移动 Android 应用可能通告了其支持远程控制视频播放。安装该应用的穿戴式版本后,它便可以使用 CapabilityClient 检查其移动版是否已安装并支持该功能。如果已安装且支持该功能,穿戴式应用便可以显示播放/暂停按钮,以通过消息来控制另一设备上的视频。
利用所支持的穿戴式应用详情功能也可实现反向操作。
发送消息
MessageClient 可以发送消息,非常适合进行远程过程调用 (RPC),例如通过穿戴式设备控制手持式设备的媒体播放器,或者通过手持式设备启动穿戴式设备上的 intent。 消息也适用于单向请求或请求/响应通信模型。
如果手持设备和穿戴式设备已连接,系统会将消息加入队列等待传递,并返回成功的结果代码。如果设备未连接,则会返回错误。返回成功的结果代码并不能说明消息已成功传递,因为设备可能会在收到结果代码后断开连接。
传输数据
ChannelClient 可以将数据从手持式设备传输至穿戴式设备。 借助 ChannelClient,您可以执行以下操作:
  • 如果使用附加到 DataItem 对象的 Asset 对象时未提供自动同步,当无法连接互联网时,您可以在两台或更多已连接的设备之间传输数据文件。ChannelClient DataClient 更节省磁盘空间,后者在与连接的设备同步之前,会在本地设备上创建资源的副本。
  • 可靠地发送因过大而无法使用 MessageClient 发送的文件。
  • 传输流式数据,例如来自麦克风的语音数据。
同步数据
DataClient 会提供一个 API,供组件读取 DataItemAsset 或者向其中写入数据。
DataItem 会在 Wear OS 网络中的所有设备之间同步。可以在不连接至任何节点的情况下设置数据项。当节点连接到网络时,这些数据项会进行同步。
数据项仅对创建它们的应用可见,并且只能由该应用在其他节点上访问。它们通常很小。使用 Assets 来传输更大、更持久的数据对象,例如图像。
Wear OS 支持多部穿戴式设备连接到一部手持设备。例如,如果用户在手持式设备上保存了一条记事,它会自动显示在用户的所有 Wear OS 设备上。 为了在设备之间同步数据,Google 服务器在设备网络中托管了一个云节点。系统会将数据同步到直接连接的设备、云节点,以及通过 Wi-Fi 连接到云节点的穿戴式设备。

警告:系统会将内容传输到所有可用的 Wear OS 设备,即使是未安装您应用的设备也不例外。对于手持设备和 Wear OS 设备,如果要同步大量数据,请考虑检查是否安装有“接收器”应用并且该应用在线,以避免在这两种设备上浪费资源。

监听重要的数据层事件(针对服务)
通过扩展 WearableListenerService,您可以在服务中监听重要的数据层事件。系统会管理 WearableListenerService 的生命周期,在需要发送数据项或消息时绑定到该服务,而在不需要执行任何操作时取消绑定该服务。
监听重要的数据层事件(针对前台 activity)
通过在某个 activity 中实现 OnDataChangedListener,您可以在此 activity 处于前台时监听重要的数据层事件。使用此监听器代替 WearableListenerService 后,您可以仅在用户正在使用您的应用时监听相关更改。

警告:由于这些 API 专用于实现手持式设备与穿戴式设备之间的通信,因此您只能使用这些 API 在这些设备之间建立通信。例如,不要尝试打开底层套接字来创建通信通道。

客户端对比

下表显示了每个客户端的不同要求和用例。

数据客户端 消息客户端 通道客户端
数据大小超过 100 KB。
可以向当前未连接的节点发送消息
通信模式 基于网络的共享资源 一对一消息传递(含响应) 一对一流式传输

连接性

数据层有两个通信选项:

  1. 在手表与其他设备之间建立蓝牙连接后直接交换数据。
  2. 通过可用网络(例如 LTE 或 Wi-Fi)交换数据。
图 1. 包含手持式设备和穿戴式设备的节点网络示例。

所有数据层客户端都可以使用蓝牙或 Google Cloud Sync 交换数据,具体取决于设备可用的连接。当蓝牙不可用时,Google 使用 Cloud Sync 服务在穿戴式设备和手机之间通信和交换数据。

安全性

蓝牙和 Cloud Sync 服务这两种通信方式均采用端到端加密。

为了确保手机与手表之间的通信安全并且采用的是应用到应用形式,Google Play 服务会实施以下限制。

  • 软件包名称必须在各种设备间保持一致。
  • 软件包签名必须在各种设备间保持一致。

蓝牙

使用蓝牙连接设备时,数据层会使用此连接。使用蓝牙时,设备之间会建立一个使用标准蓝牙加密机制(由 Google Play 服务管理)的加密通道。

云端

假设使用数据层传输的数据有时可能使用 Google 拥有的服务器。例如,无法使用蓝牙时,DataClientMessageClientChannelClient 会自动通过 Google Cloud 进行路由。通过 Google Cloud 传输的所有数据均经过端到端加密。

生成及存储密钥

用于云端通信的端到端密钥由手机生成,当手机与手表通过蓝牙连接时,密钥会直接交换给手表。这个过程发生在设备设置期间。Google 拥有的服务器在任何时候都不会接收这些密钥。

在端到端密钥生成之前,无法通过 Google 拥有的服务器进行通信。密钥存储在所有已配对设备的 Google Play 服务私有文件存储区中。

设备备份

系统不会备份密钥,也不会将其外泄。如果需要新密钥(例如对于新手机),系统会生成新密钥并将其分享给用户仍拥有的设备。