我已经为 LocationManager 注册了位置更新,每10秒
mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10 * 1000, 50, this);
但是onLocationChanged
回调每10秒返回一个位置,其中(位置)超过2小时。而且这个时间戳永远不会改变。
问题是:
2小时后我在一个完全不同的位置(主页),我在wifi上使用了该设备。现在,我位于其他位置(办公室)的另一个位置,我的应用程序将当前位置显示为主页。同样的事情发生在昨天的主页,当时它显示 office 作为我当前的位置。当我关闭我的应用程序,打开 FourSquare 应用程序并重新打开我的应用程序时,它开始工作(开始显示正确的位置)。
完整代码:
public class LocationService extends Service implements LocationListener {
public static double curLat = 0.0;
public static double curLng = 0.0;
private LocationManager mgr;
private String best;
private Location location;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
best = LocationManager.NETWORK_PROVIDER;
location = mgr.getLastKnownLocation(best);
if (location != null) {
dumpLocation(location);
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
10 * 1000, 50, this);
}
return START_NOT_STICKY;
}
}
private void dumpLocation(Location l) {
SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy:hh:mm:ss",
Locale.ENGLISH);
String format = s.format(l.getTime());
//The above time is always 28/03/2013:09:26:41 which is more than 2 hrs old
curLat = l.getLatitude();
curLng = l.getLongitude();
}
@Override
public void onLocationChanged(Location location) {
dumpLocation(location);
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
以这种方式启动活动:
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, LocationService.class);
pi = PendingIntent.getService(this, 0, i,
PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 10000, pi);
清单中的权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
我现在可以通过打开其他基于位置的应用程序(如地图,导航器,Foursquare等)来获取正确的位置。但是,为什么我的应用程序无法从提供商处获得新的/全新修复。
谢谢
答案 0 :(得分:4)
由于这条线
,您将获得旧位置 location = mgr.getLastKnownLocation(best);
因为如果没有启用GPS,它会显示旧位置。所以删除这个代码它将像冠军一样工作 您也可以参考这个库
https://github.com/nagendraksrivastava/Android-Location-Tracking-Library
根据您的评论我编辑了答案好的让我逐行解释
location = mgr.getLastKnownLocation(best);
它将为您提供最后知道位置的对象,然后它将进入内部,如果条件,它将调用dumplocation并将获取最后的位置数据,之后您调用
mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
10 * 1000, 50, this);
但是假设GPS提供商已被禁用,那么它将无法获取新位置,因此您只能获得旧位置。所以要么你可以像
那样改变它if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
{
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,new NagendraSingleLocationListener(),null);
}
else
{
locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,new NagendraSingleLocationListener(),null);
}
答案 1 :(得分:0)
我认为,因为您立即取消了待处理的意图,因此requestLocationUpdate在您取消之前不会开始更新。为什么不睡觉可能会在取消前2秒钟。
答案 2 :(得分:0)
根据我的经验,即使gps的卫星无法工作,当您请求更新时,android也会为您提供位置信息。因此,即使gps处于打开状态-如果您位于内部或位置较差的地方(例如在桥下),android也会为您提供旧的修复程序。确实可以是很老的了。
我发现100%起作用的唯一事情是通常不使用第一个位置,而只记得时间。当新职位到达时,您可以检查时间是否比上次更新。如果只想使用非常精确的位置,则可能还需要检查一下location.getAccuracy()是否低(越低越好)。
我使用gps获取soap接口的时间戳,因为android时钟有时可能非常不正常,这是我从gps获取有效时间的唯一方法。