Osmdroid, определяем местоположение

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

Вот и все, теперь наша метка будет перемещаться вслед за нами. А в следующей статье мы нарисуем на карте наш пройденный путь.

Поделиться этим материалом