AndroidKotlin-使用fusedLocationProviderClient.getCurrentLocation获取位置的行为异常

ygya80vv  于 2023-01-15  发布在  Android
关注(0)|答案(1)|浏览(512)

我目前正在开发一个Android应用程序(Kotlin)以获取位置(纬度和经度)按需(只有当按下浮动操作按钮),并显示在一些文本视图,我不需要不断更新的位置(requestLocationUpdates).在其他函数中,我检查权限,所以所有这一切显然是好的.我创建了apk文件,安装在我的手机上(摩托罗拉One Vision - Android 11)和我去步行测试一些位置和获取坐标,但我得到了一些奇怪的东西。当我按下地理定位按钮时,几秒钟后我得到了坐标。之后如果我要走5米或10米(大概走了8到15秒),然后试着再去找一次位置,有3种可能发生了:

  • 我得到了一个新的位置后,几秒钟(3至5)与新的坐标,所以这是好的。当这种情况发生时,我看到谷歌ubication的小图标在状态栏。
    *我得到的位置(坐标)和我之前在走5到10米之前得到的位置是一样的。谷歌位置的图标没有出现在状态栏里,我几乎立刻就得到了“位置已获得”的消息(我在吐司词里看到了“位置已获得”的消息)。为了得到一个新的坐标,我不得不等5秒钟,然后多次按下按钮。
  • 我几乎立刻就得到了新的坐标(写着“获得位置”的吐司),而没有看到状态栏中的小谷歌ubication图标。

我不理解“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
    }

我有一个用于individuoViewModel._localization的观察器,以便在它检测到新值时刷新TextView。

zujrkrfu

zujrkrfu1#

getCurrentLocation()函数使用Android中的融合位置提供程序API获取设备的当前位置。优先级设置为高精度,这意味着设备将使用GPS、Wi-Fi和移动的网络来确定位置。您观察到的行为可能是由于融合位置提供程序API的工作方式所致。
首次请求位置时,设备将使用GPS来确定位置,这可能需要几秒钟的时间。如果在首次请求后的几分钟内再次请求位置,设备可能会使用缓存的位置,而不是从GPS请求新位置。这就是为什么你能看到几乎即时获得的位置。如果设备无法使用GPS确定新的位置,就会发生这种情况。
当您移动几米并再次请求位置时,设备可能会使用GPS来确定新位置,这可能需要几秒钟的时间。但是,如果设备仍然无法使用GPS确定新位置,它可能会再次返回缓存的位置。
这是正常的,你没有看到谷歌位置的小图标在状态栏中,这个图标出现时,设备正在积极使用GPS来确定位置,但它不会出现时,设备正在使用缓存位置或其他来源,如wifi或移动的网络。
总之,融合位置提供程序API结合使用GPS、Wi-Fi和移动的网络来确定设备的位置,如果设备无法使用GPS确定新位置,它可能会返回缓存的位置。获取位置所需的时间和位置的准确性可能会因设备的环境和位置源的可用性而异。

相关问题