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
,且值必须为 true
或 false
。该元素可指明您的手表应用是否为不需要手机端 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 应用
您必须确保在应用的 Android 清单文件中指定了
<uses-feature>
标记。该标记必须指明这是一个 watch
应用,如以下代码段中的 android:name="android.hardware.type.watch"
:
<manifest> ... <uses-feature android:name="android.hardware.type.watch" /> ... </manifest>
共享代码和数据存储
您可以在 Wear 应用和手机应用之间共享代码,也可以将专用于某个设备类型的代码放在单独的模块中。
例如,网络的通用代码可以位于共享库中。
您可以使用标准 Android 存储 API 在本地存储数据,就像在手机上存储一样。例如,您可以使用 SharedPreferences API 或 Room 持久性库。
在另一台设备上检测您的应用
您的手表应用可以检测对应的手机应用是否可用,反之亦然。
您的手机应用或手表应用可使用 CapabilityClient
向配对的设备宣告自身的存在。它可以静态或动态地执行此操作。当某个应用在用户的 Wear 网络节点上(即在手机、配对的手表或云端上)时,CapabilityClient
支持与之对应的应用检测其是否已安装。如需了解详情,请参阅宣告功能。
如果您的某个应用无法检测到与之对应的应用,您可以让用户打开其远程设备上的 Play 商店详情。该解决方案适用于需要配对手机应用存在才能正常运行的手表应用。为此,必须先检查远程设备上是否有 Play 商店。
请注意,并非所有手机都支持 Play 商店(如 iPhone 等)。
本部分介绍了针对以下情形的最佳做法:
- 您的独立手表应用需要您的手机应用
- 您的手机应用需要您的独立手表应用
请查看展示此功能的示例。如需详细了解下文所述的类,请参阅 Wear API 参考。此参考中还有关于 PhoneDeviceType
类的信息,该类包含 getPhoneDeviceType()
方法,可让您的 Wear 应用检查配套手机是 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 模块中,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>
如需了解详情,请参阅宣告功能。
从手表进行应用检测并打开网址
您的手表应用可检测用户的配对手机上是否装有您的手机应用:
-
使用
CapabilityClient
检查您的手机应用是否已安装在配对的手机上。如需了解详情,请参阅示例。 -
如果您的手机应用未安装在手机上,请使用
PhoneDeviceType.getPhoneDeviceType()
方法检查手机类型。 -
如果返回
PhoneDeviceType.DEVICE_TYPE_ANDROID
,则表示该手机是 Android 手机。在 Wear 设备上调用RemoteIntent.startRemoteActivity()
以打开手机上的应用商店。为您的手机应用使用市场 URI(它可能不同于您的手机 URI)。例如,使用如下所示的市场 URI:market://details?id=com.example.android.wearable.wear.finddevices
-
如果返回
PhoneDeviceType.DEVICE_TYPE_IOS
,表示手机是 iOS 手机(没有 Play 商店)。通过在 Wear 设备上调用RemoteIntent.startRemoteActivity()
,打开 iPhone 上的应用商店。您可以指定应用的 iTunes 网址,例如https://itunes.apple.com/us/app/yourappname
。在 iPhone 上,您无法通过 Wear OS 以编程方式确定是否已安装您的手机应用。最佳做法是为用户提供一个机制(例如,一个按钮),让其通过手动触发来打开应用商店。
请注意,借助上述 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 设备上是否装有您的手表应用:
-
使用
NodeClient
,查找连接到用户手机的所有手表。如需了解详情,请参阅示例。 -
使用
CapabilityClient
,检查用户的哪个手表安装了您的应用。 -
如果并非用户的所有手表都安装了您的应用(将第 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 将使用配对手机获取位置数据。
仅获取必要的数据
通常情况下,从互联网获取数据时,您应仅获取必要的数据。否则,可能会引发不必要的延迟、内存占用和电量消耗。
通过低功耗蓝牙连接手表时,您的应用获得的带宽可能只有每秒 4 千字节,具体取决于手表。因此,建议您执行以下步骤:
- 审核您的网络请求和响应,确保仅针对手机应用获取额外数据
- 在通过网络将大图片发送到手表之前先将其压缩
对于需要高带宽网络的情况,请参阅高带宽网络访问。
更多代码示例
WearVerifyRemoteApp 示例进一步演示了如何使用本页介绍的 API。