首页 > 解决方案 > 在我使用 Fused Location Client 的 android 应用程序中,为什么使用此代码时 GPS 会过时

问题描述

我的应用程序会显示一个导航图,如果当前 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....

谷歌地图比我更擅长阅读 GPS。我是否应该考虑另一种方法。

标签: androidgpslocation

解决方案


欢迎加入遭受谷歌之手的人的俱乐部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
}

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

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

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

一些问题引起的链接FusedLocationProvider

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

FusedLocationProvider由于缓存而导致问题

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

在某些情况下如何FusedLocationProvider表现不佳

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


推荐阅读