LocationManager. Объект типа location не помещается в строку
Цель: добавить в приложение функционал гео локации > пользователь мог по нажатию кнопки определить свое местоположение > сохранить эти данные в TextView для дальнейшей с ними работы. Для этого создан отдельный само писный метод setUpLocationListener,вызываемый в главном Activity. Класс MyLocationListener работает для получения ссылку на объект типа location, в виде набора координат типа double > конвертируемые в строку > строка отображается в TextView. Проблема: в моменте преобразования данных с объекта location в строку на выходе получаю null на экране при тесте. Подскажите пожалуйста, в чем может быть проблема.
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class MyLocationListener implements LocationListener {
/**
* @param myPosition - переменная типа Location, для сохранения данных о геолокации, получаемых через объект
* LocationManager в методе requestPermission
* @param PERMISSION_REQUEST - обязательная проверка в requestPermissions
* @param city - сохраняем координаты из объекта Location в строку для отобржения в объекте TextView
*/
public static Location myPosition;
private static final int PERMISSION_REQUEST = 1;
public static String city = "";
/**
* Метод вызывается в основной Activity для получения и обновения данныхо состоянии myPosition.
* Основное действие в locationManager.requestLocationUpdates() - получение геоданных
*/
public static void setUpLocationListener(Context context) {
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new MyLocationListener();
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST);
} else {
if (locationManager != null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, locationListener);
}
myPosition = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
/*------- Получить название города из координат -------- */
String cityName = "";
Geocoder gcd = new Geocoder(context, Locale.getDefault());
List<Address> addresses;
try {
addresses = gcd.getFromLocation(myPosition.getLatitude(),
myPosition.getLongitude(), 1);
if (addresses.size() > 0) {
System.out.println(addresses.get(0).getLocality());
cityName = addresses.get(0).getLocality();
}
} catch (IOException e) {
e.printStackTrace();
}
city = "\nМой город: "
+ cityName;
}
}
// не вызываем
@Override
public void onLocationChanged(Location location) {
myPosition = location;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
Вызов в MainActivity
private void location() {
MyLocationListener.setUpLocationListener(this);
textGeo = findViewById(R.id.text_geo);
if (MyLocationListener.myPosition != null) {
textGeo.setText(MyLocationListener.city);
} else {
textGeo.setText("Локация не определена");
}
}
Местоположение не выводится в строке с названием города.