独立 Wear OS 应用与非独立 Wear OS 应用

默认建议是让 Wear OS 应用独立于手机运行,这样用户无需访问 Android 或 iOS 手机就可以在手表上完成任务。

您可以将 Wear OS 应用标记为依赖于搭载合作伙伴 Android 应用的 Android 手机,但我们不建议这样做。这不仅意味着您的应用在与 iOS 设备配对时无法正常运行,还意味着您的应用不符合在 Google Play 商店中进行推广的条件。

规划应用

您可以使用 Android App Bundle,为同一应用详情下每个用户的设备配置自动生成经过优化的 APK。这样,用户便可以只下载运行您的应用所需的代码和资源。

如需了解如何设置您的应用以通过 Google Play 商店进行分发,请参阅打包和分发 Wear OS 应用以及Android App Bundle 入门指南

注意:为了符合在 Wear OS 设备上的 Google Play 商店中(即在手表上的 Play 商店中)推广的条件,您的应用需要能够独立于手机运行,此外还需要能够支持 iOS 以及 Android。

一般情况下,独立应用和 Wear OS 2.0 的最低目标 API 级别为 API 级别 25。

如需了解网络请求和高带宽网络访问,请参阅 Wear OS 上的网络访问和同步

将应用定义为 Wear OS 应用

您必须在应用的 Android 清单文件中定义 <uses-feature> 标记。例如,指明它是一款手表应用,如以下示例所示:

  <manifest>
  ...
  <uses-feature android:name="android.hardware.type.watch" />
  ...
  </manifest>
  

将应用标识为独立应用

Wear OS 应用必须在 Android 清单文件中将 meta-data 元素 com.google.android.wearable.standalone 设为 truefalse

该元素可指明您的手表应用是否为不需要手机端 Android 应用即可运行的独立(独立/半独立)应用。如果将该元素的值设为 true,则可以在与 iPhone 配对的手表上的 Play 商店中提供您的应用,前提是所有发布渠道(例如,在测试版中)中目前使用的 APK 都将该元素设为 true

如果该设置没有应用于目前向用户提供的所有 APK(Alpha 版、Beta 版和正式版),那么当用户搜索与 iPhone 配对的手表时,系统不会显示您的应用。

手表应用可以归入以下类别之一:

  • 完全独立于手机应用
  • 半独立(手机应用不是必需的,只提供可选功能)
  • 依赖于手机应用

如果手表应用是完全独立应用或半独立应用,则归入独立类别。您必须通过将此 meta-data 元素的值设为 true,向 Google Play 商店指明此分类:

<application>
...
  <meta-data
    android:name="com.google.android.wearable.standalone"
    android:value="true" />
...
</application>

由于独立应用(即独立应用或半独立应用)可由 iPhone 用户或没有安装 Play 商店的 Android 手机用户安装,因此该类手表应用应该可以在没有手机应用的情况下使用。

如果手表应用依赖于手机应用,应将上面的 meta-data 元素的值设为 false。将该元素的值设为 false 表示手表应用应仅安装在与具有 Play 商店的手机配对的手表上

注意:即使该值为 false,用户也可以在安装手机应用前安装手表应用。因此,如果手表应用检测到配对手机缺少必要的手机应用,则手表应用应提示用户安装该手机应用。

共享代码和数据存储

您可以在 Wear OS 应用和手机应用之间共享代码,也可以将专用于某个设备类型的代码放在单独的模块中。

例如,网络的通用代码可以位于共享库中。

您可以使用标准 Android 存储 API 在本地存储数据,就像在手机上存储一样。例如,您可以使用 SharedPreferences APIRoom 持久性库。

在另一台设备上检测您的应用

您的手表应用可以检测对应的手机应用是否可用,反之亦然。

您的手机应用或手表应用可使用 CapabilityClient 向配对的设备宣告自身的存在。它可以静态或动态地执行此操作。当某个应用在用户的 Wear OS 网络节点上(例如手机、配对的手表或云端上)时,CapabilityClient 支持与之对应的应用检测其是否已安装。如需了解详情,请参阅宣告功能

如果您的某个应用无法检测到与之对应的应用,您可以让用户打开其远程设备上的 Play 商店详情。该解决方案适用于需要配对手机应用存在才能正常运行的手表应用。为此,必须先检查远程设备上是否有 Play 商店。

请注意,并非所有手机都支持 Play 商店(如 iPhone 等)。

本部分介绍了针对以下情形的最佳做法:

  • 您的独立手表应用需要您的手机应用
  • 您的手机应用需要您的独立手表应用

请查看 GitHub 上展示此功能的示例。如需详细了解下文介绍的类,请参阅 Wear OS API 参考文档。 该参考文档中还有关于 PhoneDeviceType 类的信息,借助该类中包含的 getPhoneDeviceType() 方法,您的 Wear OS 应用可以检查配对手机是 Android 设备还是 iOS 设备。

指定用于检测应用的功能名称

对于与每个设备类型(手表或手机)对应的应用,请在 res/values/wear.xml 文件中为功能名称指定一个唯一的字符串。

例如,在 mobile 模块中,wear.xml 文件可包含以下内容:

<resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@array/android_wear_capabilities">
    <string-array name="android_wear_capabilities">
        <item>verify_remote_example_phone_app</item>
    </string-array>
</resources>

在 Wear OS 模块中,wear.xml 文件将包含一个不同的功能名称值,如下所示:

<resources xmlns:tools="http://schemas.android.com/tools"
        tools:keep="@array/android_wear_capabilities">
    <string-array name="android_wear_capabilities">
        <item>verify_remote_example_wear_app</item>
    </string-array>
</resources>

如需了解详情,请参阅宣告功能

从手表进行应用检测并打开网址

您的手表应用可检测用户的配对手机上是否装有您的手机应用:

  1. 使用 CapabilityClient 检查您的手机应用是否已安装在配对的手机上。如需了解详情,请参阅 GitHub 上的 示例
  2. 如果您的手机应用未安装在手机上,请使用 PhoneDeviceType.getPhoneDeviceType() 方法检查手机类型。
  3. 如果返回 PhoneDeviceType.DEVICE_TYPE_ANDROID,则表示该手机是 Android 手机。在 Wear OS 设备上调用 RemoteActivityHelper.startRemoteActivity() 以打开手机上的应用商店。为您的手机应用使用市场 URI(它可能不同于您的手机 URI)。例如,使用如下所示的市场 URI:market://details?id=com.example.android.wearable.wear.finddevices
  4. 如果返回 PhoneDeviceType.DEVICE_TYPE_IOS,表示手机是 iOS 手机(没有 Play 商店)。通过在 Wear 设备上调用 RemoteActivityHelper.startRemoteActivity(),打开 iPhone 上的应用商店。您可以指定应用的 iTunes 网址,例如 https://itunes.apple.com/us/app/yourappname。在 iPhone 上,您无法通过 Wear OS 以编程方式确定是否已安装您的手机应用。最佳做法是为用户提供一个机制(例如,一个按钮),让其通过手动触发来打开应用商店。

请注意,借助上述 RemoteActivityHelper API,您可以指定通过手表在手机上打开任何网址,而不需要手机应用。

检测配对手机类型的详细信息

以下代码段使用 getPhoneDeviceType() 方法检查与手表配对的手机类型:

Kotlin

var phoneDeviceType: Int = PhoneDeviceType.getPhoneDeviceType(context)

Java

int phoneDeviceType = PhoneDeviceType.getPhoneDeviceType(context);

getPhoneDeviceType() 方法可返回以下值:

返回值 说明
DEVICE_TYPE_ANDROID 配对手机是 Android 设备。
DEVICE_TYPE_IOS 配对手机是 iOS 设备。
DEVICE_TYPE_ERROR_UNKNOWN 确定配对手机类型时出错,稍后应再次检查。

从 Android 手机启动应用检测

您的 Android 手机可以检测用户的 Wear OS 设备上是否装有您的手表应用:

  1. 使用 NodeClient,查找连接到用户手机的所有手表。如需了解详情,请参阅 GitHub 上的 示例
  2. 使用 CapabilityClient,检查用户的哪个手表安装了您的应用。
  3. 如果并非用户的所有手表都安装了您的应用(将第 1 步的结果与第 2 步的结果进行比较),则允许用户通过 RemoteActivityHelper.startRemoteActivity() 方法从手机上打开其余 Wear OS 设备上的 Play 商店。具体而言,针对 Wear OS 应用使用市场 URI(其可能不同于您的手机应用的 URI)。例如,使用如下所示的市场 URI:market://details?id=com.example.android.wearable.wear.finddevices

与 iPhone 配对的手表的位置数据

对于与 iPhone 配对的手表,开发者应使用 Fused Location Provider (FLP) 获取手表上的位置数据。请参阅在 Wear OS 上检测位置

如果配对手机可用,FLP 将使用配对手机获取位置数据。

仅获取必要的数据

通常情况下,从互联网获取数据时,您应仅获取必要的数据。否则,可能会引发不必要的延迟、内存占用和电量消耗。

通过低功耗蓝牙连接手表时,您的应用获得的带宽可能只有每秒 4 千字节,具体取决于手表。因此,建议您执行以下步骤:

  • 审核您的网络请求和响应,确保仅针对手机应用获取额外数据
  • 在通过网络将大图片发送到手表之前先将其压缩

对于需要高带宽网络的情况,请参阅高带宽网络访问

更多代码示例

WearVerifyRemoteApp 示例进一步演示了如何使用本页介绍的 API。