为什么我在 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);
我只是制作了一个应用程序来显示我当前的位置坐标。但是如果我改变我的位置然后它会显示我的旧位置坐标。如果我重新启动我的设备,它会再次显示正确的坐标。
这是我获得坐标的代码的一部分:
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);