Android Kotlin -使用fusedLocationProviderClient.getCurrentLoca



我目前正在开发一个应用程序在Android (Kotlin)获得位置(纬度和经度)按需(仅当按下浮动动作按钮),并在一些TextViews中显示它们,我不需要不断更新的位置(requestLocationUpdates)。在其他功能中,我正在检查权限,所以所有这些显然都很好。我创建了apk文件,安装在我的手机上(摩托罗拉One Vision - Android 11),我去散步测试了一些位置和坐标,但我得到了一些奇怪的东西。当我按下地理定位按钮时,几秒钟后我就得到了坐标。在那之后,如果我走了5到10米(大约8到15秒),并试图再次找到位置,可能会发生三种情况:

  • 我得到了一个新的位置几秒钟后(3到5)与新的坐标,所以这是好的。当这个发生的时候,我在状态栏上看到了google出版物的小图标。
  • 我得到了相同的位置(坐标),我之前走了5到10米 。状态栏没有出现google位置的图标,我看到的是"位置已获取"的信息。几乎是瞬间(我在祝酒词中看到"获得的位置")。为了获得一个新的坐标,我不得不等待大约5秒,并多次按下按钮。
  • 我几乎立即得到了新的坐标(带有"获取位置"的吐司),而没有看到状态栏中的小谷歌应用图标。

我不明白"getCurrentLocation"的行为我担心第二种情况(得到相同的坐标比以前)。为什么呢?我能做些什么来解决getCurrentLocation的行为?我希望每次我按下按钮,我得到新的坐标,即使我必须等待几秒钟。第三种情况很奇怪。我怎么能得到一个新的坐标这么快,在某些情况下,在其他情况下(第一种情况),我必须等待。

这是我的代码只激活getCurrentLocation函数。

@SuppressLint("MissingPermission")
fun getLocation(){
if (isGPSActivated){
fusedLocationProviderClient.getCurrentLocation(
LocationRequest.PRIORITY_HIGH_ACCURACY,
object : CancellationToken() {
override fun onCanceledRequested(p0: OnTokenCanceledListener) = CancellationTokenSource().token
override fun isCancellationRequested() = false
})
.addOnSuccessListener { location: Location? ->
if (location == null) {
Toast.makeText(
this,
"Can't get location, try again",
Toast.LENGTH_SHORT
).show()
}
else {
updateLocationInViewModel(location)

Toast.makeText(
this,
"Location obtained",
Toast.LENGTH_SHORT
).show()
}
}
.addOnFailureListener {
Toast.makeText(
this,
"Can't get location, try again",
Toast.LENGTH_SHORT
).show()
}
}
}

fun updateLocationInViewModel(currentLocation: Location){
individuoViewModel._localization.value = currentLocation
}

我有一个观察者的个人视图模型。_localization,这样当它检测到一个新值时,TextViews就会刷新。

getCurrentLocation()函数使用Android中的fusion Location Provider API来获取设备的当前位置。优先级设置为高精度,这意味着设备将使用GPS, Wi-Fi和移动网络来确定位置。你所观察到的行为很可能是由于fusion Location Provider API的工作方式。

当你第一次请求位置时,设备将使用GPS来确定位置,这可能需要几秒钟。如果您在第一次请求后几分钟内再次请求位置,设备可能会使用缓存的位置,而不是从GPS请求新的位置,这就是为什么您几乎立即看到获得的位置。如果设备无法使用GPS确定新位置,则可能发生此情况。

当你移动了几米并再次请求位置时,设备可能会使用GPS来确定新的位置,这可能需要几秒钟。但是,如果设备仍然无法使用GPS确定新的位置,它可能会再次返回缓存的位置。

在状态栏中看不到google位置的小图标是正常的,当设备正在积极使用GPS来确定位置时,这个图标会出现,但当设备使用缓存位置或其他来源(如wifi或移动网络)时,它不会出现。

总之,fusion Location Provider API使用GPS、Wi-Fi和移动网络的组合来确定设备的位置,如果设备无法使用GPS确定新位置,它可能会返回一个缓存的位置。获取位置所需的时间和位置的准确性取决于设备的环境和位置源的可用性。

相关内容

  • 没有找到相关文章

最新更新