onLocationChanged总是返回我的旧位置

时间:2013-03-28 06:25:57

标签: android locationmanager

我已经为 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等)来获取正确的位置。但是,为什么我的应用程序无法从提供商处获得新的/全新修复。

谢谢

3 个答案:

答案 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获取有效时间的唯一方法。