在我使用 Fused Location Client 的 Android 应用程序中,为什么使用此代码时我的 GPS 会过时

use*_*002 2 gps android location

我的应用程序显示导航图,如果当前 GPS 位置可用,它也会显示。我在一艘沿着已知路线行驶的船上对此进行了测试。有时会显示正确的位置。有时我会得到旧的 GPS 位置,即使是在要求重新读取时也是如此。有时,它似乎会卡在旧位置进行多次读取。当这种情况发生时,我运行了谷歌地图,它似乎清除了错误,我又开始获取新的位置。

// try to look at GPS....
        status1 = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
        if (status1 != PackageManager.PERMISSION_GRANTED)
        {   requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},10);
        }
        status2 = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
        Object cancellationToken = null;
        if (status2 == PackageManager.PERMISSION_GRANTED)
            fusedLocationClient.getCurrentLocation(PRIORITY_HIGH_ACCURACY, (CancellationToken) cancellationToken)
                    .addOnSuccessListener(this, location -> // using lambda expression...

                    {   if (location != null)
                    {   GPSLatitude = location.getLatitude();
                        GPSLongitude = location.getLongitude();
                        gotGPS = true;
                        //if we have a location, and it is on chart, draw the blue dot....
Run Code Online (Sandbox Code Playgroud)

谷歌地图比我更擅长读取 GPS。我应该考虑另一种方法吗?

mig*_*WOZ 9

欢迎加入那些在谷歌的手下受苦的人们的俱乐部FusedLocationProvider,我建议您改用LocationManagerGPS提供商。可用于请求您的Activityas中的位置

fun getLocation() {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
        ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
         // do proper permissions handling
         return
    }
    val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    val gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
    if (gpsEnabled) {
        // Register for location updates
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0.0f, locationListener)
            
        // Or get last known location
        val location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
    }
}

private val locationListener = LocationListener {
        // Do something with the location
}
Run Code Online (Sandbox Code Playgroud)

有时FusedLocationProvider可能会提供不准确的位置

在某些情况下,我发现它FusedLocationProvider相当不准确,在最近的一次经历中,与您的经历没有什么不同,我无法FusedLocationProvider在我的应用程序中使用 GPS 锁定,当我打开谷歌地图时,GPS 锁定引脚会立即出现。所以我做了一些研究,果然我发现了错误,FusedLocationProvider并且最终使用了LocationManger,至于为什么它会这样,我遇到的一些要点是

  1. 它Fused,意味着它使用多种来源(WiFi、网络、GPS 等),它会选择它认为合适的来源,或混合使用所有来源来决定位置
  2. FusedLocationProvider的最大卖点是它针对电池使用进行了优化,因此只要它可以为您提供位置(通常准确,但并非总是如此),如果它确定调用会给硬件带来不必要的负载,它就不会影响硬件。电池
  3. 它似乎也在进行位置缓存,这可能是过时位置修复的原因,在这个问题的评论中,用户分享了他们对此案例的体验

一些导致问题的链接FusedLocationProvider

如何FusedLocationProvider影响之前使用的数据收集应用程序的位置准确性LocationManger

FusedLocationProvider由于缓存而导致问题

为什么LocationManager提供更准确的位置

FusedLocationProvider在某些情况下表现不佳的原因

如何FusedLocationProvider提供不准确的结果,请参阅得票第二高的答案