为什么我在 Android 应用程序中尝试查找当前位置坐标时得到的是旧位置坐标?

Why I am getting old location coordinates in my Android app while trying to find the current location co-ordinates?


我只是制作了一个应用程序来显示我当前的位置坐标。但是如果我改变我的位置然后它会显示我的旧位置坐标。如果我重新启动我的设备,它会再次显示正确的坐标。
这是我获得坐标的代码的一部分:

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BWN_UPDATE,MIN_DIST_CHANGE_FOR_UPDATES,this);

                if (locationManager != null){
                    location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                }
                if (location != null){
                    longitude = location.getLongitude();
                    latitude = location.getLatitude();
                }

getLastKnownLocation() 不利于立即获得准确的结果,因为它无需等待 GPS 定位即可运行 - 它只为您提供位置,该位置由系统缓存(您可以尝试 运行 使用应用程序的其他位置例如 Google 地图,然后 运行 你的和位置会更新)。

要使其按预期工作,您可以使用 LocationListener 接口的 onLocationChanged 方法 - 尝试此处解释的方法 How to get current location in Android

GPS 功能需要时间来根据要求识别您的位置。

当您更改位置时,您需要等待 GPS 设置新位置的时间。到那时,LocationManager 将 return 您在 :

的旧位置
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

在 Samsung Galaxy 设备中,当您启动 GPS(定位)按钮时,图标开始在状态栏区域闪烁。这是告诉用户 GPS 现在正在搜索新位置。当找到新位置时,图标将停止闪烁并显示通知 "Location set by GPS" 从技术上讲,您将在 onLocationChanged() 收到回调这次。对于此回调,您需要实现 LocationListener

当您重新启动设备时,GPS 有足够的时间来设置新位置,因此它会为您提供正确的位置

使用 onLocationChanged() 回调而不是 getLastKnownLocation()。这是一个示例代码:

LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    // Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            if (location != null){
                longitude = location.getLongitude();
                latitude = location.getLatitude();
            }


        }
    };

如何以及何时注册 Location Listener?

如果您想要位置侦听器在地图上显示当前位置,那么您应该在 onCreate()onResume() 中注册位置侦听器activity 方法并在 onPause()onStop() 方法中注销接收器。要取消注册位置更新,您可以使用以下方法。

locationManager.removeUpdates(locationListener) 

另外,GPS 始终无法锁定位置,因此我建议您也使用网络提供商。只需添加此语句。

  locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BWN_UPDATE,MIN_DIST_CHANGE_FOR_UPDATES,locationListener);

并通过将 locationListener 而不是 this 作为 的第三个参数来更改您的 GPS 注册声明locationManager.requestLocationUpdates();

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BWN_UPDATE,MIN_DIST_CHANGE_FOR_UPDATES,locationListener);