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

我们建议 Wear OS 应用独立于手机工作,以便用户可以在没有 Android 或 iOS 手机的情况下完成手表上的任务。如果您的手表应用需要手机互动,您必须将 Wear OS 应用标记为非独立式应用,并采取措施确保用户可以使用手机应用。

规划应用

您可以使用 Android 应用包 自动为每个用户的设备配置生成优化的 Android 软件包套件 (APK),这些 APK 位于同一应用列表中。 这使得用户仅下载运行应用所需的代码和资源。

有关通过 Google Play 商店分发应用设置的更多信息,请参阅 打包和分发 Wear OS 应用 以及 Android 应用包 入门指南。

对于新应用,目标 API 级别必须为 30 或更高。 有关更多信息,请参阅 满足 Google Play 的目标 API 级别要求。 将 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 应用程序。因此,如果您的 Wear OS 应用程序检测到附近的掌上设备缺少必要的配套应用程序,请提示用户安装配套应用程序。

Google 在应用程序服务期间验证应用程序独立状态的准确性。此值会影响应用程序在未绑定设备(例如未与掌上设备配对的 Wear OS 设备)上的 Play 商店中的可见性。非独立式应用程序以及开发者错误地指定为“独立式”的应用程序将无法供用户在这些未绑定设备上使用。

在您的 Wear OS 应用程序中,设置 meta-data 元素 com.google.android.wearable.standalone 在 Android 清单文件中的值,以声明您的应用程序是独立式还是非独立式。

如果您的手表应用程序是完全独立的独立应用程序,请通过将 com.google.android.wearable.standalone 的值设置为 true 来通知 Google Play 商店。

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

如果您的手表应用程序是非独立式的,并且依赖于另一个应用程序来提供核心功能,请将 com.google.android.wearable.standalone 的值设置为 false。这表示手表应用程序需要另一个设备,但不影响您在 Google Play 商店中的应用程序推广。

注意:即使 com.google.android.wearable.standalone 的值为 false,手表应用程序也可以在安装手机应用程序之前安装。因此,如果您的手表应用程序 检测到 如本页所述,配套手机缺少必要的手机应用程序,请提示用户安装手机应用程序。

共享代码和数据存储

代码可以在 Wear OS 应用程序和手机应用程序之间共享。例如,用于网络的通用代码可以位于共享库中。

可以选择将特定于表单因子的代码放在单独的模块中。

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

检测另一个设备上的应用程序

您的手表应用程序和相应的手机应用程序可以分别检测到另一个应用程序是否可用。

您的手机和手表应用程序可以使用 CapabilityClient 将其存在情况宣传给配对设备。它们可以静态地或动态地执行此操作。

当应用程序位于用户 Wear OS 网络中的节点上时(例如在手机、配对手表或云端),CapabilityClient 允许其他应用程序检测到它。有关更多信息,请参阅 宣传功能

如果您的应用程序之一无法检测到另一个应用程序,您可以提示用户在受影响的设备上打开 Play 商店列表。对于需要配套手机应用程序才能正常工作的手表应用程序来说,这是一个解决方案。

您必须检查 Play 商店是否在设备上可用,因为并非所有手机(例如 iPhone)都支持 Play 商店。

以下部分描述了两种情况的最佳实践

  • 您的独立式手表应用程序需要您的手机应用程序。
  • 您的手机应用程序需要您的独立式手表应用程序。

您还可以查看 数据层助手示例,该示例展示了如何使用 数据层助手库(是 Horologist 的一部分)。这些助手允许您监控掌上设备和 Wear OS 设备之间的连接。有关以下部分中描述的类的更多信息,请参阅 Wear OS API 参考。该参考还包括有关 PhoneTypeHelper 类的信息,该类包含一个 getPhoneDeviceType() 方法,允许您的 Wear OS 应用程序检查配套手机是 Android 设备还是 iOS 设备。

为检测您的应用程序指定功能名称

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

例如,在您的移动模块中,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>

有关更多信息,请参阅 宣传功能

应用程序检测和从手表打开 URL

您的手表应用程序可以检测用户的配套手机是否安装了您的手机应用程序。请按照以下步骤操作

  1. 使用 CapabilityClient 检查您的手机应用程序是否安装在配对的手机上。有关更多信息,请参阅 GitHub 上的 数据层助手示例
  2. 如果您的手机应用程序没有安装在手机上,请使用 PhoneDeviceType.getPhoneDeviceType() 方法检查手机的类型。有关详细信息,请参阅以下部分。
  3. 如果返回 PhoneDeviceType.DEVICE_TYPE_ANDROID,则该手机是 Android 手机。在 Wear OS 设备上调用 RemoteActivityHelper.startRemoteActivity() 以在手机上打开 Play 商店。使用手机应用程序的市场 URI,这可能与您的 Wear 应用程序的 URI 不同。例如,使用以下市场 URI:market://details?id=com.example.android.wearable.wear.finddevices
  4. 如果返回 PhoneDeviceType.DEVICE_TYPE_IOS,则该手机是 iOS 手机,没有 Play 商店可用。通过在 Wear OS 设备上调用 RemoteActivityHelper.startRemoteActivity() 打开 iPhone 上的 App Store。您可以指定应用程序的 iTunes URL,例如 https://itunes.apple.com/us/app/yourappname

    从 Wear OS,您无法以编程方式确定您的手机应用程序是否安装在 iOS 设备上。作为最佳实践,为用户提供一种机制,以便手动触发打开 App Store 的操作。

注意:使用前面描述的 RemoteActivityHelper API 指定从手表在手机上打开任何 URL,并且不需要手机应用程序。

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

以下代码段使用 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_UNKNOWN 配套手机是未知设备。
DEVICE_TYPE_ERROR 在确定配对手机类型时发生错误;稍后应进行另一次检查。

从 Android 手机开始的应用程序检测

您的 Android 手机可以检测用户的 Wear OS 设备是否安装了您的手表应用程序。请按照以下步骤操作

  1. 使用 NodeClient 查找连接到用户手机的所有手表。有关更多信息,请参阅 GitHub 上的 数据层助手示例
  2. 使用 CapabilityClient 检查用户的哪些手表安装了您的应用程序。
  3. 如果您的应用程序没有安装在所有用户的腕表上,请允许用户使用 RemoteActivityHelper.startRemoteActivity() 方法从手机打开剩余 Wear OS 设备上的 Play 商店。使用 Wear OS 应用程序的市场 URI,这可能与手机应用程序的 URI 不同。例如,使用以下市场 URI:market://details?id=com.example.android.wearable.wear.finddevices

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

对于与 iPhone 配对的手表,请使用 融合位置提供程序 (FLP) 在手表上获取地理位置数据。有关更多信息,请参阅 在 Wear OS 上检测位置

如果配套手机可用,FLP 会使用配套手机来获取地理位置数据。

仅获取必要的数据

通常,从互联网获取数据时,仅获取必要的数据。否则,您可能会引入不必要的延迟、内存使用和电池使用。

当手表通过 Bluetooth LE 连接连接时,您的应用程序可能只能访问每秒 4 千字节的带宽,具体取决于手表。因此,建议采取以下步骤

  • 审核网络请求和响应,查找仅手机应用程序需要的额外数据。
  • 在通过网络将大型图像发送到手表之前压缩它们。

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

其他代码示例

数据层助手示例 进一步演示了本页介绍的 API 的使用方法。