Android: Mapview中的位置更新需要很长时间,即使找到了位置



我在MapView应用程序中的位置侦听器有问题。特别是时间的问题,我的实际位置会被画在地图上。

我给MapView附加了两个监听器。第一个等待来自网络的信号,第二个等待来自GPS的信号。在侦听器实现的开始,我得到最后已知位置,以减少时间,而其他提供者搜索位置。

MapView中My locationlistener的调用方式如下:

public void locationManager(){
    mLocationUpdateHandlerGPS       = new LocationUpdateHandler();
    mLocationUpdateHandlerNetwork   = new LocationUpdateHandler();
    mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //-------Check if Network is available-----
    mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationUpdateHandlerNetwork);
    //-------Check if GPS is available---------
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, mLocationUpdateHandlerGPS);

}

我实现监听器的LocationUpdateHandler.class是这样的:

public class LocationUpdateHandler implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        int lat = (int) (location.getLatitude() * 1E6);
        int lng = (int) (location.getLongitude() * 1E6);
        //Log Actual Position
        Log.v(TAG, "Actual Postion // Get Latitude: " + lat);           
        Log.v(TAG, "Actual Postion // Get Longitude: " + lng);
        mMyLocationOverlay.enableMyLocation();
        Log.v(TAG, "Enable Location returns: "+mMyLocationOverlay.enableMyLocation());
        mMyLocationOverlay.runOnFirstFix(new Runnable() {
            @Override
            public void run() {
                mMapView.getController().animateTo(
                        mMyLocationOverlay.getMyLocation());
            }
        });
    }
}

Map启动后,查看DDMS的Log Output,可以看到Location是get in Time.

08-29 14:50:16.136: VERBOSE/GeoTagMapActivity(7300): Running Activity GeoTagMapActivity
08-29 14:50:20.691: VERBOSE/GeoTagMapActivity(7300): Enable Location returns: true
08-29 14:50:20.691: VERBOSE/GeoTagMapActivity(7300): Actual Postion // Get Latitude: *******
08-29 14:50:20.691: VERBOSE/GeoTagMapActivity(7300): Actual Postion // Get Longitude: *******

不过,还需要2 - 5分钟,该位置才会在地图上画出来。

我不知道问题在哪里。谢谢你的帮助!

MyLocationOverlay是Android版谷歌地图的辅助类。它做它自己的位置获取,更具体地说,它使用GPS来做它。

由于您调用runOnFirstFix(runnable),它等待在执行代码之前获得GPS修复。这有时需要几分钟(尤其是在室内)。因此延迟了。这也完全有可能获得基于网络的位置,但不是GPS位置(特别是在室内),所以在这种情况下,你的代码将永远不会被执行(除非MyLocationOverlay在超时后回落到网络提供商-这不是任何地方解释)。

您在日志中看到的位置是您通过网络位置提供商(wifi和蜂窝网络位置)获得的位置。

就像@user370305在评论中建议的那样删除runOnFirstFix()

最新更新