Lokalizowanie użytkownika w Androidzie

Fundamentalną częścią mojej aplikacji jest moduł lokalizujący użytkownika. Dane pobierane w tej części kodu będą wykorzystywane przez dalsze funkcjonalności aplikacji. W tym poście przedstawię Ci proces budowanie klasy odpowiadającej za pobieranie lokalizacji.

pexels-photo-108994

Trochę teorii

W Androidzie istnieją dwa główne sposoby ustalania lokalizacji. Najdokładniejsza przez GPS i o wiele mniejszej precyzji lokalizacja przez adres IP, z którego wykonujemy zapytanie czyli przez Internet. Oczywiście na początku staramy się aby lokalizacja była pobierana przez GPS, a dopiero kiedy nie mamy takiej możliwości przez Internet.

Aplikacja, która chce korzystać z lokalizacji musi otrzymać odpowiednie uprawnienie. W swojej aplikacji pytam użytkownika o uprawnienie do lokalizacji już przy uruchomieniu aplikacji.

Klasa LocalizationTracker

Klasa lokalizująca musi dziedziczyć po klasie LocationListener. Pierwszą rzeczą jest utworzenie odpowiednich zmiennych, getterów oraz konstruktora klasy. Ja z racji wywoływanie klasy w metodach onCreate i onPause zdecydowałem się na utworzenie instancji klasy i inicjowanie jej przez metodę, która wymaga argumentu Context.

private Context mContext;

public boolean isGPSEnabled = false;
private boolean isNetworkEnabled = false;

private boolean canGetLocation = false;

private Location location;
private double latitude;
private double longitude;

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1; // 10 meters
private static final long MIN_TIME_BETWEEN_UPDATES = 1000 * 60 * 4;

private static final LocationTracker INSTANCE = new LocationTracker();

protected LocationManager locationManager;

private LocationTracker() {}

public void init(Context mContext) {
    this.mContext = mContext;
    checkPermission();
    getLocation();
}

public static LocationTracker getInstance() {
    return INSTANCE;
}

Następnie metoda pobierająca lokalizację, która sprawdza czy może pobrać informacje z danego sposoby lokalizacji i zapisuje pobrane współrzędne do odpowiednich zmiennych.

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext
                .getSystemService(Context.LOCATION_SERVICE);

        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        Log.d("isGPSEnabled", "=" + isGPSEnabled);

        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        Log.d("isNetworkEnabled", "=" + isNetworkEnabled);

        if (isNotLocationEnabled()) {
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled && checkPermission()) {
                location = null;
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BETWEEN_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                Log.d("Network", "Network");
                if (locationManager != null) {
                    location = locationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            if (isGPSEnabled) {
                this.canGetLocation = true;
                location = null;
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BETWEEN_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return location;
}

Przyda nam się też metoda, dzięki której wyświetlimy zdobyte wcześniej dane w sposób, z którego możemy od razu odczytać dokładny adres.

public String getLocationName() {
    Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
    try {
        List<Address> listAddresses = geocoder.getFromLocation(latitude, longitude, 1);
        if(null!=listAddresses&&listAddresses.size()>0){
            String locationName = listAddresses.get(0).getLocality();
            locationName += " " + listAddresses.get(0).getAddressLine(0);
            return locationName;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "Error";
}

Wypadałoby na końcu zakończyć tą karuzelę lokalizacji. Do tego służy metoda stopUsingGPS

public void stopUsingGPS() {
    if (locationManager != null && checkPermission()) {
        Log.d("GPS", "Stopped using GPS");
        locationManager.removeUpdates(LocationTracker.this);
        locationManager = null;
    }
}

W tej klasie jest jeszcze jedna metoda, o której wspomniałem na początku postu. Chodzi o metodę sprawdzająca uprawnienia.

public Boolean checkPermission() {
    if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mContext,
            Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return true;
    } else {
        return false;
    }
}

W aktywności, w której chcemy użyć klasy, którą opisałem wyżej, wystarczy pobrać jej instancje, zainicjować ją i już można z niej korzystać. Ważną rzeczą jest utworzenie metody onPause, w której użyjemy metody stopUsingGPS, aby aplikacja nie używała niepotrzebnie energii kiedy z niej nie korzystamy.

Jedna uwaga do wpisu “Lokalizowanie użytkownika w Androidzie

  1. Attractive section off content. I simply stumbled upon your
    bllg and in accession capital to assert that I get in fact enjoyed account
    your webblog posts. Anywway I will be subscribing in your augment and even I fulfilpment you access consistently fast.

    Polubienie

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s