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

Долго я прочёсывал интернет в поисках простого решения, как мне в проект добавить 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" />

Комментарии 16

    –1
    Примеры работы с Location есть в самом Android SDK.

    теперь у нас всегда и в любой части нашего проекта есть переменная MyLocationListener.imHere
    Такое обращение моветон же. По-моему, тут лучше использовать шаблон Listeners.
      0
      см. первую часть статьи.
      примеры в SDK хорошие и полезные, но они рассчитаны на более хорошее понимание Location API и не предлагают решения «из коробки». Этот же класс работает по принципу «скопировал, подключил, используешь».

      Я вот думаю, что надо было бы сделать тип myLocation, который бы сам ещё и инициализацию проводил в конструкторе, чтобы пользователю совсем не нужно было беспокоиться о существовании листнеров и менеджеров: просто объявил переменную и она всегда показывает твоё местоположение.
        –1
        примеры в SDK хорошие и полезные, но они рассчитаны на более хорошее понимание Location API и не предлагают решения «из коробки». Этот же класс работает по принципу «скопировал, подключил, используешь».

        Да ну?
        Посмотрите пример из директории /android-sdk-linux/extras/google/google_play_services/samples/maps
        К примеру, класс MyLocationDemoActivity.java.
          0
          Целиком поддерживаю предыдущего оратора: «По-моему, тут лучше использовать шаблон Listeners.»
          А если необходимо отслеживать местоположение. Не просто обращаться к текущему, а именно трекинг.
          Делать цикл и проверять поле? Или все-таки Listener? =)
            0
            Если делать отслеживание — тут конечно лучше использовать listener, ибо в данном случае кроме цикла нет способа следить, но часто в проекте позиция нужна «на текущий момент» (см. foursquare, например) и вот для таких приложений как раз этот класс и подойдёт. Часто пользователю нужно знать «где я?», а не «куда вы меня тащите?». Ну и плюс здесь обсуждается «простой способ», а не «написание навигатора с нуля».
        +1
        Во-первых, это старый способ. Есть новее, с использованием com.google.android.gms.location
        Во-вторых, явное указание GPS_PROVIDER, это «пока батарейка»
          –1
          1) если речь идёт об этом, то в текущем виде оно не удовлетворяет первому требованию «работать из коробки». Если это причесать отдельным классом — да, но оно мне попросту не попалось на глаза.
          2)
          // здесь можно указать другие более подходящие вам параметры
            +1
            Да, об этом способе (1)
            В чем он не удовлетворяет требованию «работать из коробки»? Тем, что нужно добавить 1 библиотеку?
            Он у меня в приложениях он одним классом реализован.
              0
              Можешь скинуть сюда код класса с кратким описанием по использованию? Будет явно не лишним.
          0
          Я думаю на данный момент лучше использовать Google Play Services для подобных целей, а подобные обертки писать если GPS недоступно(когда возможно приложения от Гугла выпилены). По крайней мере в доке сейчас такой способ:
          Retrieving the Current Location
            0
            Кроме того, это Java. Здесь принято методы писать с маленькой буквы.
              –2
              Комментарии не читай: комментарии пиши. Обсуждение этого есть выше.

              А про методы с маленькой буквы — я буду переучиваться.
                0
                В том обсуждении неуказано, что обертка тоже может быть полезной(правда не в таком виде), когда Google Play Services недоступен на что я и обратил внимание. Кроме того чем больше людей говорит об этом тем более стоит прислушаться к ним.
                  0
                  Безусловно, но я пока не могу найти того, что удовлетворяет условиям задачи: «подключил класс и всегда имеешь под рукой переменную, где указано твоё последнее местоположение».
                    0
                    Оберните код по ссылке в документации в свой класс и будете просто вызывать одну строку: MySuperLocationClient.getCurrentLocation(). В чем проблема то?)
                    Дело в том, что в типичном приложении нынче Вам не обойтись без Google Play Services Library потому что Google вынес туда и Admob и кое-что еще. Так что не вижу никаких проблем, кроме надумывания себе задач из разряда велосипед.
                      0
                      Можешь привести здесь готовый код класса?
                      Дело в том, что за всё время пока я искал по сети статьи по геолокации нигде не было одного простого метода решения. Простым считалось решение в котором было указано меньше 5 кусков кода которые нужно распихать по своему проекту. Я же поставил перед собой цель сделать код максимально простым для разработчика, так чтобы можно было взять, скопировать к себе в проект и сразу работать. Итогом конечно приходишь ты и говоришь, что есть статья про LocationClient и что всё написанное мной можно выбросить. Но блин! Эта же статья не выполняет основное условие поста. Если ты приведёшь её к виду простого класса скрывающего всю логику внутри себя и выдающего пользователю только координату — сделай это во имя инкапсуляции.
                      Скрытый текст
                      в

                      Проблема

                      три

                      обернуть

                      страницы


                      класс

                      этот

                      несвязанного


                      для новичков

                      текста

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое