Android: Обновление местоположения в Mapview занимает много времени, даже в трудных условиях Местоположение найдено - PullRequest
1 голос
/ 29 августа 2011

У меня проблема с моим приемником местоположения в приложении MapView. Особенно проблема со временем, моя фактическая позиция будет нарисована на карте.

Я подключил двух слушателей к моему MapView. Первый ожидает сигнала от сети, а второй от GPS. В начале реализации прослушивателя я получаю Последнее известное местоположение, чтобы сократить время, пока другие провайдеры ищут позицию.

Мой LocationListner в MapView вызывается следующим образом:

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());
            }
        });
    }

}

После запуска карты я проверяю вывод журнала из 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 минут, пока позиция не будет нарисована на карте.

Понятия не имею, где проблема. Спасибо за вашу помощь!

1 Ответ

1 голос
/ 29 августа 2011

MyLocationOverlay - это вспомогательный класс Карт Google для Android.Он выполняет определение своего местоположения, точнее, использует для этого GPS.

Так как вы звоните runOnFirstFix(runnable), он ожидает получения исправления GPS, прежде чем выполнять ваш код.Это может иногда (особенно в помещении) занимать минуты.Отсюда и задержка.Также вполне возможно получить сетевое местоположение, но не местоположение GPS (особенно в помещении), поэтому в этом случае ваш код никогда не будет выполнен (за исключением случаев, когда MyLocationOverlay возвращается к сетевому провайдеру после истечения времени ожидания - это нигде не объясняется).

Позиция, которую вы видите в журналах, - это позиции, которые вы приобретаете у поставщика сетевых расположений (местоположения Wi-Fi и сотовой сети).

Просто удалите runOnFirstFix(), как @ user370305 предложил в комментариях.

...