Pull to refresh

Простой способ добавить геолокацию в свой проект для Android

Reading time3 min
Views60K
Долго я прочёсывал интернет в поисках простого решения, как мне в проект добавить 1 только класс и больше не беспокоиться о проблемах геолокации.
Критерии были такие:
1) решить всё в 1 классе, как можно меньше используя внешний код.
2) у пользователя должна быть всегда под рукой 1 static переменная в которой указанно его местоположение и больше ни о чём он знать не должен.

Большинство постов не отвечало на поставленный вопрос: конечно сначала нужно обратиться к сервису, потом нужно установить listner, потом вы можете посмотреть на трёхстраничный краткий пример как это делать.
В итоге я написал свой класс, с которым и хочу вас познакомить: он прост в использовании и с ним сможет справиться любой: просто добавьте его в проект и будет вам счастье.

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;

class MyLocationListener implements LocationListener {

	static Location imHere; // здесь будет всегда доступна самая последняя информация о местоположении пользователя.
	
    public static void SetUpLocationListener(Context context) // это нужно запустить в самом начале работы программы
	{
		LocationManager locationManager = (LocationManager) 
				context.getSystemService(Context.LOCATION_SERVICE);
		
		LocationListener locationListener = new MyLocationListener();  
		
		locationManager.requestLocationUpdates(
				LocationManager.GPS_PROVIDER,
				5000,
				10,
				locationListener); // здесь можно указать другие более подходящие вам параметры

		imHere = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
	}

    @Override
    public void onLocationChanged(Location loc) {
		imHere = loc;
    }
    @Override
    public void onProviderDisabled(String provider) {}
    @Override
    public void onProviderEnabled(String provider) {}
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {}
}


Итак, что же здесь есть?

Класс разделен на 3 части:
1) imHere — переменная типа Location, в которой будет всегда доступна самая последняя информация о местоположении пользователя.
2) функция SetUpLocationListener — в любом случае нам нужна будет начальная установка для того, чтобы система начала сама без нашего участия выполнять обновление переменной imHere.
3) все остальные обязательные части LocationListener, которые можно переделать по собственному желанию.

Итак, как это работает?

1) создаем класс MyLocationListener
2) копируем в него код написанный выше
3) в основной функции (например MainActivity) ближе к началу запускаем:

MyLocationListener.SetUpLocationListener(this);

или для любителей потоков
final Context mainContext = this;
		  new Thread(new Runnable() {
			    @Override
				public void run() {
			        MyLocationListener.SetUpLocationListener(mainContext);
			    }
			}).start();


4) теперь у нас всегда и в любой части нашего проекта есть переменная MyLocationListener.imHere типа Location, в которой хранится самое последнее местоположение пользователя и множество дополнительной информации, как например скорость или точность определения местоположения.

И в заключение: это принципиальный код и тут есть что улучшать. Например нужно учитывать, что первое время локация может быть не определена и imHere будет null, но это всё не скоро: сейчас у нас есть класс, который позволяет нам без лишних усилий и с минимумом знаний добавить геолокацию в свой проект.

(!) Не забудьте: в зависимости от выбранного провайдера нужно добавить в манифест соответствующее разрешение. Например используемый выше GPS_PROVIDER требует добавления следующей строчки в манифест:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Tags:
Hubs:
+2
Comments16

Articles

Change theme settings