P
P
powercot2015-05-05 13:14:48
Android
powercot, 2015-05-05 13:14:48

How do I make the marker follow my location on Google maps?

There is a class that shows my current location on the map with a standard blue dot ( using mMap.setMyLocationEnabled(true); ). I want to make sure that my location is marked with a marker that moves after it (I need a marker, not a standard blue dot, because in the future I plan to make it clickable with displaying several functions).
I tried to solve the problem in several ways (look at the very bottom of the "setUpMap()" function), but the marker was not placed on the newly received coordinates. It was possible to put it only on the coordinates set manually.
Help, please, to solve a problem.

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));//зум без анимации
    }

Answer the question

In order to leave comments, you need to log in

3 answer(s)
P
powercot, 2015-05-06
@powercot

Issue resolved. If someone needs implementation, write here.

M
MDAlastar, 2015-07-04
@MDAlastar

If you don't mind, could you show the implementation of this problem. I would be very grateful.

O
OM1, 2016-09-07
@OM1

E! how did you decide? Well, oh my...

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question