【问题标题】:requestLocationUpdates generates location by wrong timerequestLocationUpdates 按错误时间生成位置
【发布时间】:2013-01-19 15:00:55
【问题描述】:

我正在尝试从 2 个不同的提供商处获取位置信息:网络和 GPS。

我在requestLocationUpdates 中使用 minTime 1 分钟和 minDistance 300 米。使用这些参数,我不希望每分钟(每个提供商)获得超过一个更新。问题是,我获得更新的频率比这更高(每分钟超过 1 次)。为什么?

这里有一些代码来演示:

    mLocationManager.removeUpdates(listener);
    if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEN_SECONDS*6, TEN_METERS*30, listener);

    if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, TEN_SECONDS*6, TEN_METERS*30, listener);

这里是监听器:

private final LocationListener listener = new LocationListener() 
{

    @Override
    public void onLocationChanged(Location location) 
    {
        if(location.getProvider().equals(LocationManager.NETWORK_PROVIDER))
            updateUILocation(location,LocationService.this.gpsLocation);
        else
            updateUILocation(LocationService.this.networkLocation, location);   
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
};

更新UILocation:

private void updateUILocation(Location networkLocation,Location gpsLocation) 
{
    Location location = null;
    if(gpsLocation == null || gpsLocation.getAccuracy() > 800)
    {
        if(!(networkLocation == null || networkLocation.getAccuracy() > 800))
            location = networkLocation;
    }
    else
        if(networkLocation == null)
        {
            if(gpsLocation.getAccuracy() < 800)
                location = gpsLocation;
        }
        else
            if(gpsLocation.getAccuracy() < networkLocation.getAccuracy() && gpsLocation.getAccuracy() < 500)
                location = gpsLocation;
            else
                if(networkLocation.getAccuracy() < 800)
                    location = networkLocation;
    if(location!=null)
    {
         if (mGeocoderAvailable) 
            doReverseGeocoding(location);
    }

    // Bypass reverse-geocoding only if the Geocoder service is available on the device.

}

doReverseGeocoding 将位置转换为文本并调用处理程序:

    mHandler = new Handler() 
    {
        public void handleMessage(Message msg) 
        {
            if(msg.what == UPDATE_ADDRESS) // msg.what == 1
            {
                LocationService.this.address = (String) msg.obj;
                new SendLocation(LocationService.this.id,(String)msg.obj); //send the location to the db
                LocationService.this.gpsLocation = null; //reset gps value
                LocationService.this.networkLocation = null; //reset network value
            }
        }
    };

我在开车时测试了这个应用程序(这意味着 minDistance 参数不是一个因素),我每分钟收到超过 1 个位置更新。

这是我在测试时收到的位置(请忽略位置,因为它是希伯来语,只是看时间):http://imrip.interhost.co.il/

【问题讨论】:

    标签: java android geolocation


    【解决方案1】:

    "minTime 是 1 分钟,minDistance 是 300 米。用那些 参数我永远不应该在不到 1 分钟的时间内获得 2 个位置..."

    这根本不是真的,无论如何都不是 JellyBean 之前的。

    http://developer.android.com/reference/android/location/LocationManager.html

    在 Jellybean 之前,minTime 参数只是一个提示,一些位置提供程序实现忽略了它。从 Jellybean 开始,Android 兼容设备必须遵守 minTime 和 minDistance 参数。

    在 JB 之前,您可以比您指定的最短时间更频繁地获得更新,尤其是在 GPS 接收信号不佳的情况下。有关详细信息,请参阅此答案:

    requestLocationUpdates interval in Android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2016-03-15
      相关资源
      最近更新 更多