我的手机没有移动,但GPS lat/long
值不断变化,这就是为什么?
如何解决此问题?如何获得我的移动设备的可靠lat长值......我使用以下代码获取GPS位置:
public Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
if (isGPSEnabled) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
// Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
// Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
答案 0 :(得分:6)
有很多原因可以解决这个问题,而且可能根本不是问题。
有时,只是您的GPS可以更好地修复您的位置,或者位置提供商可能已更改。
P.S。:准确性并不好,所以您的位置可能会不时变化。正如您在this link上看到的那样。您可以从6个不同的来源获取您的位置,每个来源都有不同的准确度。
大多数机器人都能够存储最后知道的GPS位置。这通常在应用程序首次启动时使用,您可以检索时间戳,纬度,经度和准确度。
示例代码:
locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
缓存网络。
Android设备还可以存储由移动运营商的网络位置提供商确定的最后已知位置。提供商从蜂窝网络和WiFi收集信息(如果已打开),然后将其发送到远程服务器端进程,该进程处理信息并发送回大致位置。并非所有国家/地区都提供此功能。就像GPS一样,您通常会检索时间戳,纬度,经度和准确度。
示例代码:
locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
这是从GPS流出的原始信息。当GPS首次打开时,它不会立即返回任何信息,它必须首先预热。预热时间因设备而异,如果您在建筑物内,通常需要一分钟或更长时间。更多关于这一点。根据您的提供商允许的内容,您可以访问时间戳,纬度,经度,海拔高度,方位,速度,精度和行进距离。
示例代码:
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,time,distance,listener);
这是由蜂窝运营商返回的原始网络位置提供商信息,例如美国的AT& T.不同的运营商使用不同的信息来确定位置,例如WiFi数据,GPS信息,附近的蜂窝塔等。根据您的运营商允许的内容,您可以访问时间戳,纬度,经度,海拔,准确度和行进距离。
示例代码:
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,time,distance,listener);
此选项仅表示您的应用程序可以在最小化状态下侦听位置更新。我们的想法是节省电池电量,以便在应用程序最小化时,您的应用程序提供商不会全速前进。这将是巨大的电池消耗。被动位置可以侦听另一个应用程序以请求位置更新。您可以访问时间戳,纬度,经度,海拔高度和准确度。据我所知,您将无法确定从哪个提供商获取此信息。
示例代码:
<receiver android:name=".PassiveLocationChangedReceiver" android:enabled="true"/>
虽然它不是人类可读的,但您可以访问原始NMEA字符串。通常,这些字符串用于编程访问,并且只对开发人员或工程师有意义。此数据通常用于海事应用程序。数据仅在GPS预热后才可用。
来源:此信息来自here。
此外,在获取位置时有一些非常常见的错误来源,正如您从Android文档中看到的那样:
从移动设备获取用户位置可能很复杂。位置读取(无论源是什么)可能包含错误和不准确的原因有多种。用户位置中的一些错误来源包括:
- 众多位置来源
GPS,Cell-ID和Wi-Fi均可为用户提供线索位置。 确定使用和信任哪个是一个权衡问题 精度,速度和电池效率。
- 用户移动
由于用户位置发生变化,您必须考虑移动 经常重新估算用户位置。
- 改变准确度
来自每个位置来源的位置估算值不一致 在他们的准确性。 10秒前从一个来源获得的位置 可能比另一个或相同的最新位置更准确 源。
请花一些时间阅读Google的Location Strategies文档。
有关LocationManager
here的更多信息。