独立 Wear 应用

Wear OS 应用可以独立于手机运行。用户可以在手表上执行操作,无需访问 Android 或 iOS 手机。

请参阅以下相关资源:

规划您的应用

您可以使用 Google Play 的多 APK 功能在同一应用详情下发布多个 APK。您应使用该功能来分发手表 APK,而不要将手表 APK 嵌入手机 APK。如需了解如何设置您的应用以通过 Google Play 商店进行分发,请参阅打包和分发 Wear 应用以及多个 APK 如何工作

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

一般情况下,独立应用和 Wear 2.0 的最低和目标 API 级别为 25。仅当您为 Wear 1.0 和 2.0 使用同一 APK(因而具有嵌入式 Wear 1.0 APK)时,最低 SDK 级别才可以为 23。

注意:由于延迟问题会影响应用在 Wear 1.x 手表上的可用性,因此如果您构建了一个独立 Wear 2.0 APK 且继续拥有一个 Wear 1.0 APK,请执行以下两项工作:

  • 提供一个独立版本的 Wear APK
  • 继续将一个版本的 Wear APK 嵌入您的手机 APK

注意:如果您发布已移除嵌入式 Wear APK 的现有正式版手机 APK 的更新,那么在安装您的独立 Wear APK 之前更新手机 APK 的正式版用户将丢失他们的现有 Wear 应用及其数据。如果您发布现有正式版手机 APK 的更新,请继续将您的手表 APK 嵌入该手机 APK。

独立应用需要运行时权限

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

将应用标识为独立应用

Wear 应用的 Android 清单文件中必须添加一个 meta-data 元素作为 <application> 元素的子元素。meta-data 元素的名称为 com.google.android.wearable.standalone,且值必须为 truefalse。该元素可指明您的手表应用是否为不需要手机端 Android 应用即可运行的独立应用。如果将该元素的值设为 true,则可以在与 iPhone 配对的手表上的 Play 商店中提供您的应用,前提是所有发布渠道中(例如,在测试版中)目前使用的 APK 都将该元素设为 true。如果您目前向用户提供的所有 APK(Alpha 版、测试版和正式版)并非都有上述设置,则当用户在与 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 应用

您必须确保在应用的 Android 清单文件中指定了 <uses-feature> 标记。该标记必须指明您的应用是 watch 应用,例如 android:name="android.hardware.type.watch",如下所示:

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

共享代码和数据存储

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

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

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

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

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

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

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

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

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

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

请查看展示此功能的示例。如需详细了解下述类,请参阅 Wear API 参考。该参考中还有关于 PhoneDeviceType 类的信息,该类包含一个 getPhoneDeviceType() 方法,可让您的 Wear 应用检查配对手机是 Android 设备还是 iOS 设备。

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

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

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

    <resources>
        <string-array name="android_wear_capabilities">
            <item>verify_remote_example_phone_app</item>
        </string-array>
    </resources>
    

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

    <resources>
        <string-array name="android_wear_capabilities">
            <item>verify_remote_example_wear_app</item>
        </string-array>
    </resources>
    

如需了解详情,请参阅公布功能

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

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

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

请注意,借助上述 RemoteIntent 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 设备上是否装有您的手表应用:

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

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

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

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

仅获取必要的数据

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

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

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

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

更多代码示例

Android WearVerifyRemoteAppAndroid SpeedTracker 示例进一步说明了如何使用本页介绍的 API。