Android NDK开发详解Wear之在 Wear OS 上检测位置
由于手表外形小巧,屏幕信息一览无余,这让 Wear OS 平台非常适合运行用于记录、报告和响应用户位置的应用。例如,您可以构建应用,为用户提供其行进距离、速度和方向的实时更新信息,或者帮助用户一目了然地查看周围的环境。
如需了解详情,请参阅构建位置感知应用。
有些手表带有内置 GPS 传感器,可直接检索位置数据,而无需连接手机。当您在手表应用中请求获取位置数据时,系统将使用最节能的方法从手机或手表检索位置信息。因此,即使手表中没有 GPS 传感器,您仍然可以获取位置信息。
如需降低因获取位置数据而给电池续航时间带来的影响,请使用 PRIORITY_BALANCED_POWER_ACCURACY 值调用 setPriority()。 不同的优先级设置可能会以不同的方式优化芯片。
使用 setInterval() 请求位置时,尽可能不要超过每分钟一次,以节省电量。
如以下部分所述,当没有传感器的手表与手机断开连接时,您的应用需要处理位置数据丢失。
选择方法
有多种方式可用来为 Wear OS 应用提供位置数据。您可以使用一体化位置信息提供程序 (FLP) 或 Wear 健康服务 (WHS)。FLP 是一种 Google Play 服务 API。
FLP 适用于以下情况:
您目前需要位置数据(而不是一直需要),例如标记停放车辆的位置。
您一直需要位置数据,但不需要位置记录。
WHS 适用于以下情况:
您当前需要来自其他传感器的数据,或者未来可能需要来自其他传感器的数据。
您的应用是一款健身或锻炼应用,需要在特定时间间隔内跟踪位置数据。
注意:我们建议为所有锻炼跟踪选择 WHS,因为它更省电。
对于与 iPhone 配对的手表,请参阅与 iPhone 配对的手表的位置数据。
使用一体化位置信息提供程序
在手表上,使用 FusedLocationProviderClient 获取位置数据。FLP 可能会使用手机提供的位置数据。如需了解详情,请参阅创建位置信息服务客户端。
如需了解如何请求位置信息更新和持续跟踪用户位置,请参阅请求位置信息更新。
注意:创建 LocationRequest 时,请务必考虑使用 setMaxWaitTime() 进行批处理,因为它可以减少电池电量消耗并提供更准确的位置数据,具体取决于设备的硬件功能。
检测内置 GPS
如果用户佩戴未内置 GPS 传感器的手表出去慢跑,并且忘记携带与之配对的手机,您的手表应用将无法通过已连接的设备获取位置数据。您的应用需要能够检测到这种情况,并向用户发出警告,指出位置功能不可用。
如需确定手表是否带有内置 GPS 传感器,请使用 PackageManager.FEATURE_LOCATION_GPS 调用 hasSystemFeature() 方法。 以下代码可在您启动某个 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() 请求位置信息更新时,您应传入 LocationCallback 或 PendingIntent。 这两个选项均包含位置信息和 LocationAvailability 状态。
使用 LocationCallback 选项时,应替换 onLocationAvailability() 以接收关于位置信息可用性状态的更新。
当使用 PendingIntent 选项并返回 Intent 时,应使用 LocationAvailability.extractLocationAvailability(Intent) 方法从 Intent 提取位置可用性状态。
处理未找到位置事件
当 GPS 信号断开时,您可以检索用户手表最近一次的已知位置。如果无法修复 GPS 连接,或者手表没有内置 GPS 并与手机断开连接,那么检索最近一次的已知位置会很有帮助。如需了解详情,请参阅获取最近一次的已知位置。
使用批量调用 flush 位置信息
如果您使用的是批量调用,请在屏幕重新开启(或从氛围模式返回)时调用 flushLocations(),以立即将任何批量位置信息返回给所有已注册的 LocationListeners、LocationCallbacks 和 Pending Intents。
目前没有任何推荐文档页面。
请尝试登录您的 Google 账号。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-13。