Итак, мы уже научились устанавливать маркер в нужную нам позицию. Однако польза от этого не сильно велика если никто нем не будет сообщать координаты. Давайте рассмотрим как можно реализовать динамическое отображение своего местоположения или иными словами используем android.location.LocationManager
в качестве поставщика геопозиций.
Сначала небольшие приготовления — добавим в AndroidManifest.xml разрешение
... <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ...
Ну естественно нужно реализовать запрос данного разрешения. Добавим в метод onCreate()
нашей Activity
следующий код:
public class MainActivity extends AppCompatActivity implements LocationListener { // Этот код мы передаем методу ActivityCompat.requestPermissions чтобы // отличить на какой именно запрос разрешений пришел ответ. public static final int PERMISSION_REQUEST_CODE = 1; ... @Override protected void onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION, PERMISSION_REQUEST_CODE); } else { addListener(); } } } private viod addListener(){ ... } }
Осталось реализовать метод addListener()
, методы интерфейса LocationListener
и перегрузку метода onRequestPermissionsResult()
private viod addListener(){ // Получим LocationManager и добавим слушателя LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, this); } // Т.к. наша Activity реализует LocationListener, определим эти методы @Override public void onLocationChanged(Location location) throws NullPointerException { // немного измененный метод нашей Activity из предыдущей статьи updateMyMarker(location); } @Override public void onStatusChanged(String s, int i, Bundle bundle) { ... } @Override public void onProviderEnabled(String s) { ... } @Override public void onProviderDisabled(String s) { ... } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PermissionHelper.PERMISSION_REQUEST_CODE && grantResults[0] == PackageManager.PERMISSION_DENIED){ addListener(); } }
Ну и собственно код метода updateMyMarker(Location location)
private void updateMyMarker(Location location){ GeoPoint point = new GeoPoint(location); myMarker.setPosition(point); mapController.animateTo(point); map.invalidate(); // Обновляем карту }
Вот и все, теперь наша метка будет перемещаться вслед за нами. А в следующей статье мы нарисуем на карте наш пройденный путь.