Отображение текущего местоположения после включения GPS в Android

#android #gps #skmaps

#Android #gps #skmaps

Вопрос:

Я новичок Skobbler map . Я использую Skobbler map для отображения своего текущего местоположения. Изначально marker он находится где-то на карте. введите описание изображения здесь

Я установил местоположение по умолчанию в Соединенных Штатах Америки. Так что, когда я открываю приложение, оно отображает это. Но маркер все еще находится где-то на карте, над морем. Для отображения местоположения по умолчанию я использовал это:

 SKCoordinateRegion region = new SKCoordinateRegion();
region.setCenter(new SKCoordinate(-97.1867366, 38.4488163));
region.setZoomLevel(5);
mapView.changeMapVisibleRegion(region, true);
  

введите описание изображения здесь

После этого, когда я включил GPS , маркер должен перемещаться и показывать мое текущее местоположение в течение времени. Что можно сделать, чтобы обновить карту, чтобы показать мое текущее местоположение. Что можно сделать для решения этой проблемы?

Ответ №1:

TL; DR :

 SKCoordinate coordinates = new SKCoordinate (-97.1867366, 38.4488163)
SKPosition lastSKPosition  = new SKPosition (coordinates);
SKPositionerManager.getInstance ().reportNewGPSPosition (lastSKPosition);
mapView.centerOnCurrentPosition (ZoomLevel, true, AnimationDuration);
mapView.setPositionAsCurrent (lastSKPosition.getCoordinate (), Accuracy, center);
  

Не будучи экспертом в Skobbler, мне не очень нравится Skobbler SDK, поскольку он кажется мне слишком сложным, а документ очень бедным, слишком много методов и классов, поэтому я стараюсь максимально использовать Android SDK и API Google.

Это не готовый код, а просто для того, чтобы вы могли получить представление.

Вот как мне нравится организовывать свой код, когда дело доходит до местоположения :

Абстрактное действие местоположения, из которого вы расширяете все действия, использующие местоположение :

 public abstract class LocationActivity extends AppCompatActivity {

    private GeoLocService locationService;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);

        if (GeoLocService.checkLocationPerms (this)) {
            initLocService ();
        }
    }

    @Override
    protected void onStart () {
        super.onStart ();
        if (locationService != null) {
            locationService.onStart ();
        }
    }

    @Override
    public void onRequestPermissionsResult (int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult (requestCode, permissions, grantResults);
        if (requestCode == 1000) {
            if (GeoLocService.checkLocationPerms (this)) {
                initLocService ();
                locationService.onStart ();
            }
        }
    }

    @Override
    protected void onResume () {
        super.onResume ();
        if (locationService != null) {
            locationService.onResume ();
        }
    }

    @Override
    protected void onPause () {
        super.onPause ();
        if (locationService != null) {
            locationService.onPause ();
        }
    }

    @Override
    protected void onStop () {
        if (locationService != null) {
            locationService.disconnect ();
        }
        super.onStop ();
    }

    private void initLocService () {
        GeoLocService.LocationResponse response = new GeoLocService.LocationResponse () {

            @Override
            public void onLocation (Location location) {
                onLocationSuccess (location);
            }

            @Override
            public void onFailure (int errorCode) {
                onLocationFailure (errorCode);
            }
        };
        locationService = new GeoLocService (this, response);
    }

    protected void stopFetchingLocations () {
        if (locationService != null) {
            locationService.stopLocationUpdates ();
            locationService.disconnect ();
        }
    }

    protected GeoLocService getLocationService () {
        return locationService;
    }

    protected abstract void onLocationSuccess (Location location);
    protected abstract void onLocationFailure (int errorCode);
}
  

Служба геолокации, предоставляющая методы обработки геолокации :

 public class GeoLocService implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {

    public final static long    UPDATE_INTERVAL_IN_MILLISECONDS = 10000;

    public final static long    FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = UPDATE_INTERVAL_IN_MILLISECONDS / 2;

    private GoogleApiClient     googleApiClient;
    private LocationRequest     locationRequest;
    private LocationResponse    locationResponse;
    private Location            currentLocation;

    private Date                lastUpdateTime;

    public GeoLocService (Activity context, LocationResponse locationResponse) {
        this.locationResponse   = locationResponse;

        googleApiClient         = new GoogleApiClient.Builder (context)
            .addConnectionCallbacks (this)
            .addOnConnectionFailedListener (this)
            .addApi (LocationServices.API)
            .build ();

        createLocationRequest ();
    }

    public void onStart () {
        if (googleApiClient != null) {
            googleApiClient.connect ();
        }
    }

    public void onResume () {
        if (googleApiClient != null amp;amp; googleApiClient.isConnected ()) {
            startLocationUpdates ();
        }
    }

    public void onPause () {
        if (googleApiClient != null amp;amp; googleApiClient.isConnected ()) {
            stopLocationUpdates ();
        }
    }

    public void disconnect () {
        if (googleApiClient != null) {
            googleApiClient.disconnect ();
        }
    }

    protected void createLocationRequest () {
        locationRequest = new LocationRequest ();
        locationRequest.setInterval (UPDATE_INTERVAL_IN_MILLISECONDS);
        locationRequest.setFastestInterval (FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        locationRequest.setPriority (LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    public void startLocationUpdates () {
        LocationServices.FusedLocationApi.requestLocationUpdates (googleApiClient, locationRequest, this);
    }

    public void stopLocationUpdates() { 
        LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this);
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        if (currentLocation == null) {
            currentLocation = LocationServices.FusedLocationApi.getLastLocation (googleApiClient);
            lastUpdateTime  = Calendar.getInstance ().getTime ();
            sendUpdates ();
        }

        startLocationUpdates ();
    }

    private void sendUpdates () {
        if (locationResponse != null amp;amp; currentLocation != null) {
            locationResponse.onLocation (currentLocation);
        }
    }

    @Override
    public void onLocationChanged (Location location) {
        currentLocation = location;
        lastUpdateTime  = Calendar.getInstance ().getTime ();
        sendUpdates ();
    }

    @Override
    public void onConnectionSuspended (int cause) {
        googleApiClient.connect ();
    }

    @Override
    public void onConnectionFailed (ConnectionResult result) {
        if (locationResponse != null) {
            locationResponse.onFailure (result.getErrorCode ());
        }
    }

    public static boolean checkLocationPerms (Activity context) {
        if (ActivityCompat.checkSelfPermission (context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                amp;amp; ActivityCompat.checkSelfPermission (context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions (
                    context,
                    new String [] {
                            Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.ACCESS_COARSE_LOCATION,
                            Manifest.permission.ACCESS_NETWORK_STATE
                    },
                    1000
            );
            return false;
        }
        return true;
    }

    public GoogleApiClient getGoogleApiClient () {
        return googleApiClient;
    }

    public Date getLastUpdatedTime () {
        return lastUpdateTime;
    }

    public interface LocationResponse {
        void onLocation (Location location);
        void onFailure (int errorCode);
    }
}
  

И, наконец, ваша активность в Skobbler :

 public class SkobblerActivity extends LocationActivity implements SKMapSurfaceListener {

    private final static float  ZoomLevel           = 15;
    private final static int    AnimationDuration   = 750;
    private final static float  Accuracy            = 1;

    private int                 placedOnCurrentPosCount;

    private SKMapViewHolder     mapHolder;
    private SKMapSurfaceView    mapView;

    private SKPosition lastSKPosition  = new SKPosition (new SKCoordinate ());

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        .....
    }

    @Override
    protected void onLocationSuccess (Location location) {
        convertLocToSKLoc (location);
        SKPositionerManager.getInstance ().reportNewGPSPosition (lastSKPosition);
        if (mapView != null) {
            boolean center = false;
            if (placedOnCurrentPosCount < 2 amp;amp; (location.getLatitude () != 0 || location.getLongitude () != 0)) {
                center = true;
                mapView.centerOnCurrentPosition (ZoomLevel, true, AnimationDuration);
            }

            mapView.setPositionAsCurrent (lastSKPosition.getCoordinate (), Accuracy, center);

            placedOnCurrentPosCount   ;
        }
    }

    @Override
    protected void onLocationFailure (int errorCode) {
    }

    private void convertLocToSKLoc (Location location) {
        lastSKPosition.getCoordinate ().setLatitude (location.getLatitude ());
        lastSKPosition.getCoordinate ().setLongitude (location.getLongitude ());
    }

    .......................
}
  

Приветствуются любые критические замечания со стороны разработчиков skobbler по улучшению этого 🙂

Комментарии:

1. Не удается разрешить метод centerOnCurrentPosition . Zoom In При отображении местоположения возникает ошибка. Я хочу, чтобы местоположение отображалось так, как показано на рисунке выше.

2. Какую версию Sdk Skobbler вы используете?

3. Это последняя версия. Я исправил эту проблему с увеличением масштаба. Но Camera движение происходит так быстро. Когда я удаляюсь на некоторое расстояние от текущего местоположения, Camera оно обновляется так быстро. Он возвращается с этого расстояния к текущему местоположению в течение 5 или 6 секунд. Как мне это остановить? Потому что у меня есть кнопка для этой работы. Из-за автоматического обновления этого Camera моя кнопка похожа на значение меньше.

4. Измените код внутри if (mapView != null) на if (placedOnCurrentPosCount < 1 amp;amp; (location.getLatitude () != 0 || location.getLongitude () != 0)) { center = true; mapView.centerOnCurrentPosition (ZoomLevel, true, AnimationDuration); mapView.setPositionAsCurrent (lastSKPosition.getCoordinate (), Accuracy, center); }

5. Есть ли какой-либо способ centerOnCurrentPosition для этого? Он показывает, что не удается разрешить метод.

Ответ №2:

Установите для следующих положений значение True :

 mapView.getMapSettings().setFollowPositions(true);
  

Это позволит перецентрировать карту при каждом обновлении местоположения.

Комментарии:

1. Не удается разрешить метод setFollowPositions …. Этот метод выглядит примерно так : mapView.getMapSettings().setCurrentPositionShown(true); !!! Ваш ответ не то, что я ищу. Пожалуйста, напишите в комментарии вместо этого. Ваш ответ полностью противоречит моему вопросу.

2. @SatanPandeya: Я думаю, вы используете старую версию SDK.