requestLocationUpdates()最初检索缓存位置然后获取新位置吗?

时间:2012-12-14 19:26:01

标签: android-location

requestLocationUpdates()最初检索缓存位置然后获取新位置吗?

我们正在开发一款使用当前位置搜索本地商家的应用。该应用程序大部分时间都运行良好。但一旦它给了错误的位置。它返回了陈旧的位置,而不是当前位置。距离大约20英里,大约几个小时。在这两个小时内,我没有运行任何可能使用GPS或网络位置的应用程序。电话一直在打开。

该应用程序在带有姜面包的Motorola Atrix 4G上运行。由于我们只需要一次位置,我们只需使用我们得到的第一个位置。该应用程序打算在前台接收位置。

请查看代码并查看是否有任何错误。

public class MyLocation {
    LocationManager lm;
    boolean network_enabled=false;
    public static double lat = 0.0;
    public static double lng = 0.0;

    public boolean getLocation(Context context)
    {
        //I use LocationResult callback class to pass location value from MyLocation to user code.
        if(lm==null)
            lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        //exceptions will be thrown if provider is not permitted.
        try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){ex.printStackTrace();}

        //don't start listeners if provider is not enabled
        if(!network_enabled)
            return false;

        if(network_enabled)
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
        return true;
    }

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            lat = location.getLatitude();
            lng = location.getLongitude();
            lm.removeUpdates(this);
        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    };
}

1 个答案:

答案 0 :(得分:2)

接收缓存位置通常是通过调用getLastKnownLocation(LocationManager.NETWORK_PROVIDER)引起的。但是,您的代码似乎没有使用此方法。

使用类似于您所描述的应用程序并使用与您编写的代码类似的代码(没有getLastKnownLocation(LocationManager.NETWORK_PROVIDER)的代码),我们观察到requestLocationUpdates()返回缓存位置的时间,之前检索' fresh'位置。

我不相信requestLocationUpdates()本身会返回一个陈旧的位置。来自机器人文档:

  

通过回调获取Android中的用户位置。您   表示您希望从中收到位置更新   位置管理器("位置管理器")通过调用   requestLocationUpdates(),传递一个LocationListener。您的   LocationListener必须实现几个回调方法   当用户位置更改或时,位置管理器调用   服务状态发生变化。

从我们的测试中接收这些陈旧的位置肯定不常见,并且似乎影响了旧版本的android(4.0.4)

对于我们的应用程序,忽略requestLocationUpdates()返回的第一个位置就足够了,只需使用第二个位置。