我在MapView应用程序中遇到了我的位置侦听器问题。 特别是时间问题,我的实际位置将被绘制在地图上。
我将两个监听器连接到MapView。第一个等待来自网络的信号,第二个等待来自GPS的信号。在监听器实现的开始,我得到最后一个位置,以减少其他提供商搜索位置时的时间。
MapView中的我的LocationListner被调用如下:
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);
}
我实现Listener的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());
}
});
}
}
地图启动后,我检查DDMS的日志输出,可以看到位置是及时的。
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分钟,直到该位置将在地图上绘制。
我不知道问题出在哪里。 谢谢你的帮助!
答案 0 :(得分:1)
MyLocationOverlay
是Google Maps for Android的帮助类。它确实是自己的位置获取,更具体地说,它使用GPS来完成它。
由于您致电runOnFirstFix(runnable)
,因此在执行代码之前等待获得GPS修复。这有时(特别是室内)需要几分钟。因此延迟。它也完全有可能获得基于网络的位置,但不能获得GPS位置(特别是在室内),所以在这种情况下你的代码永远不会被执行(除非MyLocationOverlay
在超时后回退到网络提供者 - 这不是随处解释。
您在日志中看到的位置是您通过网络位置提供商(wifi和手机网络位置)获取的位置。
只需删除评论中建议的@ user370305 runOnFirstFix()
。