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

Posted

技术标签:

【中文标题】requestLocationUpdates() 最初是不是检索缓存位置,然后随后获取新位置?【英文标题】:Does requestLocationUpdates() retrieve cached location initially then subsequently gets fresh location?requestLocationUpdates() 最初是否检索缓存位置,然后随后获取新位置? 【发布时间】:2012-12-02 19:57:19 【问题描述】:

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.
        trynetwork_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】:

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

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

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

在 Android 中获取用户位置是通过回调的方式工作的。你 表示您希望从 LocationManager(“位置管理器”)通过调用 requestLocationUpdates(),将 LocationListener 传递给它。您的 LocationListener 必须实现几个回调方法, 位置管理器在用户位置改变或当 服务状态发生变化。

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

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

【讨论】:

以上是关于requestLocationUpdates() 最初是不是检索缓存位置,然后随后获取新位置?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 requestLocationUpdates 会在接收时立即触发?

如何等待 requestLocationUpdates() 回调意图完成?

当两个 locationManager 对象调用 requestLocationUpdates(...) 时?

requestLocationUpdates 与位置侦听器

没有使用 fusedLocationAPI.requestLocationUpdates 调用 onLocationChanged

onLocationChanged() 永远不会由 requestLocationUpdates() 触发 - Android