#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.