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

默认建议是让 Wear OS 应用独立于手机运行,这样用户无需使用 Android 或 iOS 手机就可以在手表上完成任务。不过,如果您的应用需要手机互动才能让手表应用正常运行,您必须将 Wear OS 应用标记为非独立应用。

规划应用

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

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

通常,Wear OS 应用的最低 API 级别是 API 级别 25 (Wear OS 2.0)。 目标 API 级别必须是 API 级别 28 或更高级别(了解详情),我们建议您将 targetSdkVersion 设置为 API 级别 30 (Wear OS 3),以确保您的应用适用于最新平台版本。

如需了解网络请求和高带宽网络访问,请参阅 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

此元素可指明您的手表应用是否为不需要其他设备即可运行核心功能的独立应用。在这种情况下,您需要将此元素的设置为 true

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

  • 独立应用:完全独立的应用,不需要手机应用提供核心功能(包括身份验证);手机应用将仅提供可选功能。
  • 非独立应用:需要依赖手机应用或其他设备才能提供核心功能(包括身份验证)的应用。

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

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

如果手表应用为非独立应用,请将上述 meta-data 元素的值设置为 false。将此元素设置为 false 表示手表应用需要使用其他设备,但这不会影响您的应用在 Google 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 上的 App Store。您可以指定应用的 iTunes 网址,例如 https://itunes.apple.com/us/app/yourappname。在 iPhone 上,您无法通过 Wear OS 以程序化方式确定是否已安装您的手机应用。最佳做法是为用户提供一个机制(例如,一个按钮),让其通过手动触发来打开 App Store。

请注意,借助上述 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。