在 Wear OS 上检测位置

手表的尺寸小巧、一目了然,这使得 Wear OS 成为记录、报告和响应用户位置的应用的理想平台。例如,您可以构建应用来向用户提供实时距离、速度和方向更新,或提供有关用户周围环境的一目了然的提示。

如需了解更多信息,请参阅构建具有位置感知功能的应用

有些手表内置了 GPS 传感器,无需连接手机即可获取位置数据。当您在手表应用中请求位置数据时,系统会使用最省电的方法从手机或手表中获取位置。因此,即使手表中没有 GPS 传感器,您仍然可以获取位置信息。

为了减少位置数据获取对电池寿命的影响,请调用 setPriority() 并将其值设为 PRIORITY_BALANCED_POWER_ACCURACY。不同的优先级设置可能会以不同的方式优化芯片

如果可能,请使用 setInterval() 每分钟请求位置不超过一次,以节省电池电量。

如以下部分所述,当没有传感器的手表与手机断开连接时,您的应用需要处理位置数据的丢失

选择您的方法

有几种方法可以向 Wear OS 应用提供位置数据。您可以使用融合位置信息提供程序 (FLP)Wear 健康服务 (WHS)。FLP 是一种 Google Play 服务 API。

在以下情况下使用 FLP

  • 您想即时获取位置数据,而不是持续获取,例如标记停放汽车的位置。
  • 您想持续获取位置信息,但不需要位置历史记录。

在以下情况下使用 WHS

  • 您想从其他传感器获取数据,或将来可能想从其他传感器获取数据。
  • 您的应用是一个健身或锻炼应用,需要在特定时间间隔内跟踪位置数据。

对于与 iPhone 配对的手表,请参阅与 iPhone 配对的手表的位置数据

使用融合位置信息提供程序

在手表上,使用 FusedLocationProviderClient 获取位置数据。FLP 可以使用来自手机的位置数据。有关更多信息,请参阅创建位置服务客户端

有关请求位置更新和持续跟踪用户位置的信息,请参阅请求位置更新

检测板载 GPS

如果用户戴着没有内置 GPS 传感器的手表慢跑,而将配对的手机落在后面,您的手表应用就无法通过连接的设备获取位置数据。请在您的应用中检测到这种情况,并警告用户位置功能不可用。

要确定手表是否具有内置 GPS 传感器,请调用 hasSystemFeature() 方法并传入 PackageManager.FEATURE_LOCATION_GPS。以下代码可在您启动 Activity 时检测手表是否具有内置 GPS 传感器

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.")
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
}

private fun hasGps(): Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)

Java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.");
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
    ...
}

private boolean hasGps() {
    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
}

处理断开连接事件

如果手表没有内置 GPS 传感器并失去与手机的连接,手表将失去其位置数据流。如果您的应用期望持续的数据流,则您的应用必须检测连接丢失,警告用户,并优雅地降低功能。

与移动设备一样,当您使用 FusedLocationProviderClient.requestLocationUpdates() 请求位置更新时,您会传入 LocationCallbackPendingIntent。两者都包含位置信息和 LocationAvailability 状态。

使用 LocationCallback 选项时,重写 onLocationAvailability() 以接收位置可用性状态的更新。

使用 PendingIntent 选项并返回 Intent 时,使用 LocationAvailability.extractLocationAvailability(Intent) 方法从 Intent 中提取位置可用性状态。

处理位置未找到

当 GPS 信号丢失时,您可以检索用户手表的最后已知位置。当您无法获得 GPS 定位且手表没有内置 GPS 并失去与手机的连接时,检索最后已知位置会很有帮助。有关更多信息,请参阅获取最后已知位置

通过批处理调用刷新位置

如果您正在使用批处理调用,请在屏幕重新亮起或从环境模式返回时调用 flushLocations(),以立即将所有批处理位置返回给所有注册的 LocationListenersLocationCallbacksPending Intents