Есть класс, который показывает на карте моё текущее местоположение стандартной синей точкой ( с помощью 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));//зум без анимации
}