3

是否requestLocationUpdates()最初检索缓存的位置然后随后获取新位置?

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

该应用程序在带有姜饼的摩托罗拉 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) {}
    };
}
4

1 回答 1

2

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

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

我不相信 requestLocationUpdates() 固有地返回一个陈旧的位置。从机器人文档:

在 Android 中获取用户位置是通过回调的方式工作的。您表示您希望通过调用 requestLocationUpdates() 接收来自 LocationManager(“位置管理器”)的位置更新,并传递一个 LocationListener。您的 LocationListener 必须实现多个回调方法,当用户位置更改或服务状态更改时,位置管理器会调用这些回调方法。

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

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

于 2016-03-17T21:20:27.350 回答