手表的尺寸小巧,易于一瞥,这使得 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
。以下代码在您启动活动时检测手表是否具有内置 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()
请求位置更新时,您需要传入 LocationCallback
或 PendingIntent
。这两者都包含位置信息和 LocationAvailability
状态。
当使用 LocationCallback
选项时,覆盖 onLocationAvailability()
以接收有关位置可用性状态的更新。
当使用 PendingIntent
选项并返回 Intent
时,使用 LocationAvailability.extractLocationAvailability(Intent)
方法从 Intent
中提取位置可用性状态。
处理位置未找到
当 GPS 信号丢失时,您可以检索用户手表最后已知的位置。当您无法获取 GPS 定位以及手表没有内置 GPS 并与手机断开连接时,检索最后已知的位置非常有用。有关更多信息,请参阅 获取最后已知的位置。
使用批量调用刷新位置
如果您使用批量调用,则在屏幕重新亮起或从环境模式返回时调用 flushLocations()
,以立即将所有批量位置返回到所有已注册的 LocationListeners
、LocationCallbacks
和 Pending Intents
。
为您推荐
- 注意:当 JavaScript 关闭时,会显示链接文本
- 优化位置以节省电池电量
- 创建通知 {:#notification}
- 检测用户何时开始或结束活动