@powercot

Как сделать так, чтобы маркер перемещался вслед за моим местоположением на Google maps?

Есть класс, который показывает на карте моё текущее местоположение стандартной синей точкой ( с помощью mMap.setMyLocationEnabled(true); ). Хочу сделать так, чтобы моё местоположение было помечено маркером, который перемещался вслед за ним (нужен именно маркер, а не стандартная синяя точка, потому что в будущем планирую сделать его кликабельным с отображением нескольких функций).
Пробовал решить проблему несколькими способами (посмотрите в самом низу функцию "setUpMap()"), но маркер не ставился на только что полученные координаты. Его удавалось поставить только на заданные вручную координаты.
Помогите, пожалуйста, решить проблему.
public class Map extends FragmentActivity {

    private GoogleMap mMap; // Might be null if Google Play services APK is not available.
    private LocationManager locationManager;
    public double Latitude;
    public double Longitude;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_karta);
        setUpMapIfNeeded();
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 * 10, 10, locationListener);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 10, 10, locationListener);
    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(locationListener);
    }

    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Пробуем получить карту из SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            /// Если карта получена, то продолжаем
            if (mMap != null) {// Выполняем любые функции и действия
                setUpMap();
            }
        }
    }

    private LocationListener locationListener = new LocationListener() {/*слушатель, реализует интерфейс LocationListener с методами:
Провайдеры включаются и отключаются в настройках системы. Тем самым, просто определяется доступен ли провайдер для получения от него координат. Чуть позже увидим, как можно отправить юзера в эти настройки. Программное включение/выключение провайдеров через стандартные методы недоступно.*/

        @Override
        public void onLocationChanged(Location location) {//onLocationChanged – новые данные о местоположении, объект Location. Здесь мы вызываем свой метод showLocation, который на экране отобразит данные о местоположении.
            showLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {//onProviderDisabled – указанный провайдер был отключен юзером. В этом методе вызываем свой метод checkEnabled, который на экране обновит текущие статусы провайдеров.
            checkEnabled();
        }

        @Override
        public void onProviderEnabled(String provider) {//onProviderEnabled – указанный провайдер был включен юзером. Тут также вызываем checkEnabled. Далее методом getLastKnownLocation (он может вернуть null) запрашиваем последнее доступное местоположение от включенного провайдера и отображаем его. Оно может быть вполне актуальным, если вы до этого использовали какое-либо приложение с определением местоположения.
            checkEnabled();
            showLocation(locationManager.getLastKnownLocation(provider));
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {//onStatusChanged – изменился статус указанного провайдера. В поле status могут быть значения OUT_OF_SERVICE (данные будут недоступны долгое время), TEMPORARILY_UNAVAILABLE (данные временно недоступны), AVAILABLE (все ок, данные доступны). В этом методе мы просто выводим новый статус на экран.
            /*if (provider.equals(LocationManager.GPS_PROVIDER)) {
                tvStatusGPS.setText("Status: " + String.valueOf(status));
            } else if (provider.equals(LocationManager.NETWORK_PROVIDER)) {
                tvStatusNet.setText("Status: " + String.valueOf(status));
            }*/
        }
    };

    private void checkEnabled() {//определяет включены или выключены провайдеры методом isProviderEnabled и отображает эту инфу на экране.
        //tvEnabledGPS.setText("Enabled: " + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));
        //tvEnabledNet.setText("Enabled: " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
    }

    private String formatLocation(Location location) {//на вход берет Location, читает из него данные и форматирует из них строку. Какие данные он берет: getLatitude – широта, getLongitude – долгота, getTime – время определения.
        if (location == null)
            return "";
        return String.format("Coordinates: lat = %1$.4f, lon = %2$.4f, time = %3$tF %3$tT", location.getLatitude(), location.getLongitude(), new Date(location.getTime()));
    }

    public void onClickLocationSettings(View view) {//срабатывает по нажатию кнопки Location settings и открывает настройки, чтобы пользователь мог включить или выключить провайдер. Для этого используется Intent с action = ACTION_LOCATION_SOURCE_SETTINGS.
        startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
    }

    ;

    private void showLocation(Location location) {//на вход берет Location, определяет его провайдера методом getProvider и отображает координаты в соответствующем текстовом поле.
        if (location == null)
            return;
        if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
            //tvLocationGPS.setText(formatLocation(location));
            Latitude = location.getLatitude();
            Longitude = location.getLongitude();
        } else if (location.getProvider().equals(LocationManager.NETWORK_PROVIDER)) {
            //tvLocationNet.setText(formatLocation(location));
            Latitude = location.getLatitude();
            Longitude = location.getLongitude();
        }
    }

    private void setUpMap() {// выводим значок своего местоположения
        mMap.setMyLocationEnabled(true);//выводим индикатор своего местоположения
        LatLng coordinate = new LatLng(Latitude, Longitude);
        MarkerOptions asd = new MarkerOptions();
        asd.position(coordinate).title("Test");
        mMap.addMarker(new MarkerOptions().position(new LatLng(Latitude, Longitude)).title("Test2"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinate, 0));//зум без анимации
    }
  • Вопрос задан
  • 1188 просмотров
Пригласить эксперта
Ответы на вопрос 3
@powercot Автор вопроса
Вопрос решён. Если кому-то нужна реализация, пишите сюда.
Ответ написан
Комментировать
@MDAlastar
Если вас не затруднит , могли бы вы показать реализацию данной проблемы. Буду очень признателен.
Ответ написан
Комментировать
@OM1
Э! как решил-то? Ну ё-маё...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы