Android find location java

Работаем с GPS в Android на Java

Мобильные устройства часто используются для решения различных задач связанных с определением географических координат. Транспорт, строительство, путешественники, так или иначе, нуждаются в определении своего местоположения или других объектов.

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

В Android SDK весь функционал по работе с навигационными системами объединён в пакет android.location. Ключевые компоненты данного пакета:

  • LocationManager – (класс) обеспечивает доступ к системной службе определения местоположения Android;
  • LocationListener — (интерфейс) регламентирует обработку приложение событий службы определения местоположения Android;
  • Location – (класс) представляет географические координаты полученные от навигационной системы.
Подготовка к работе

При написании Android приложения работающего с навигационными системами на Java с помощью Android SDK вначале необходимо выполнить ряд подготовительных операций.

Это связано с тем, что в отличие от Delphi, здесь отсутствуют какие-либо разрешения, предоставляемые по умолчанию и нет готовых компонентов, которые полностью брали бы на себя всю работу по взаимодействию с GPS приёмником.

Все необходимые действия потребуется выполнить самостоятельно.

Первым делом предоставляем приложению необходимые разрешения в файле манифеста.

Далее создаём в коде приложения объект LocationListener для обработки событий службы определения местоположения Android.

Назначение его методов – обработка соответствующих событий. Конкретно:

  • onLocationChanged – изменение местоположения. Именно он используется для определения текущих географических координат;
  • onStatusChanged – изменение состояния поставщика данных о местоположении. В частности приёмника GPS;
  • onProviderEnabled – получение доступа к поставщику данных о местоположении;
  • onProviderDisabled – потеря доступа к поставщику данных о местоположении.

В завершение зарегистрируем созданный нами объект LocationListener для работы с приёмником GPS.

Для этого создаём экземпляр класса LocationManager.

И выполняем регистрацию при помощи метода requestLocationUpdates.

Перед вызовом метода requestLocationUpdates обязательно необходимо проверить наличие соответствующих разрешений (оператор if). Если они отсутствуют перед оператором return можно выполнить некоторые действия. Например, записать сообщение об ошибке в журнал. Однако в любом случае при отсутствии необходимых разрешений работа с навигационной системой должна быть завершена до регистрации объекта LocationListener.

Метод requestLocationUpdates имеет несколько перегрузок. Наиболее часто используемая из них принимает четыре параметра. Именно она использована в примере выше.

  1. Поставщик данных о местоположении.
    В данном примере используется GPS;
  2. Минимальный интервал обновления данных о местоположения в миллисекундах.
    Значение «0» соответствует использованию минимально возможного интервала времени для данного устройства;
  3. Минимальное расстояние для обновления данных о местоположении в метрах.
    Значение «0» соответствует использованию минимально возможного расстояния для данного устройства;
  4. Регистрируемый объект LocationListener.

После регистрации приложение сможет получать информацию о местоположении устройства по мере его изменения.

Если необходимо получить её единовременно, необходимо вместо метода requestLocationUpdates использовать метод requestSingleUpdate, который также имеет несколько перегрузок.

Наиболее востребованная из них принимает три параметра:

  1. Поставщик данных о местоположении.
    В данном примере используется GPS;
  2. Регистрируемый объект LocationListener;
  3. Объект, реализующий обратный вызов.
    Необязательный параметр.

Пример использования метода requestSingleUpdate:

Источник

Глубокое погружение в определение местоположения

Этот пост является переводом топика из блога android-developers. Далее повествование ведется от Рето Майера, автора книги Professional Android 2 Application Development. Он пишет о том, как можно улучшить приложения, использующие местоположение, в смысле кэширования результатов, скорости работы и так далее.

Без разницы, ищете ли вы место, где бы поесть, или ближайшее место велосипедов Boris Bike, всегда есть задержка при получении данных местоположения от GPS и заполнении абстрактного списка результатов в вакууме. Когда вы находитесь в месте, где хотели бы получить контекстную информацию, то часто вы сталкиваетесь с отсутствием подключения к данным.

Вместо того, чтобы грозить кулаком в небо, я написал open-source приложение, которое включает в себя советы и рекомендации по сокращению времени между открытием приложения и просмотром актуальной информации о близлежащих местах, вкупе с разумным обеспечением offline режима работы. И всё это, сохраняя использование аккумулятора на возможном минимуме.

Покажи мне код!

Вы можете проверить мой проект Android Protips for Location. Не забудьте прочесть Readme.txt, чтобы успешно скомпилировать и запустить приложение.

Что оно делает на самом деле?

Оно использует Google Places API для реализации базовой функциональности приложений, которые которые используют местоположение для определения списка близлежащих достопримечательностей (точек на карте), позволяют просмотреть их детали, а также проверить или оценить.

Код реализует многие из лучших практик, о которых я подробно рассказал на своей сессии на Google I/O 2011, Android Protips: Advanced Topics for Expert Android Developers (видео). В том числе использование Intent’ов для получения обновлений о местоположении, используя Passive Location Provider, наблюдение за состоянием устройства для изменения частоты обновлений, переключение Receiver’ов во время исполнения приложения, и также используя Cursor Loader.

Читайте также:  Быстрые гонки для андроид

Приложение написано для Honeycomb, но также может работать и на версия 1.6 и выше.

Теперь у вас есть код, давайте подробнее рассмотрим его

Мой главный приоритет — свежесть: минимизация задержек между открытием приложения и возможностью проверить нужные места, и в то же время минимизировать использование аккумулятора.

Требования:

  • Текущее местоположение должно находиться так быстро, как это возможно
  • Список мест должен обновляться при изменение местоположения
  • Список близлежащих мест должен быть доступен (в деталях) в автономном режиме
  • Отметки также должны быть доступны в автономном режиме
  • Данные о местоположении и другие данные пользователя должны быть правильно обработаны (см. более ранний пост с лучшими практиками )

Свежесть — значит никогда не ждать

Можно значительно сократить время ожидания получения первого приближения к местоположению, путём выбора последнего известного из Location Manager’a каждый раз, когда приложение переходит в активный режим.

В этом примере из GingerbreadLastLocationFinder, мы перебираем все провайдеры местоположения на устройстве, даже те, которые на данный момент недоступны, чтобы найти наиболее точное последнее местоположение.

Если есть координаты одного или более местоположений, то выбирается самое точное. Иначе, просто возвращается самый недавний результат.

Во втором случае (когда определено, что последнее обновление местоположения недостаточно недавнее), значение так или иначе возвращается, но мы запрашиваем одно обновление местоположения, используя самый быстрый провайдер.

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

Отметим также, что этот фрагмент кода показывает GingerbreadLastLocationFinder, который использует метод requestSingleUpdate для получения единоразового обновления местоположения. Эта функциональность не была доступна до Gingerbread — проверьте LegacyLastLocationFinder, посмотрите как я реализовал такую же функциональность для более ранних версий Android.

singleUpdateReceiver передает полученное обновление назад к вызывающему классу через слушателя Location Listener.

Используйте Intent’ы для получения обновлений местоположения

Получив наиболее точную/своевременную оценку текущей позиции, мы также хотим получать её обновления.

Класс PlacesConstants включает в себя набор значений, которые определяют частоту обновления местоположения. Настройте их, чтобы убедиться, что обновления приходят так часто, как это требуется.

Следующий шаг — запросить обновление местоположения от Location Manager. В следующем фрагменте кода, взятом из GingerbreadLocationUpdateRequester мы можем передать критерии, используемые для определения — какой Location Manager будет запрашивать обновления напрямую в вызове метода requestLocationUpdates.

Обратите внимание, что мы передаём Pending Intent, а не Location Listener.

Вообще, я предпочитаю использовать Location Listener’ов, потому что они предоставляют гибкость в регистрации приёмников в нескольких Activity или Сервисах, или напрямую в манифесте.

В этом приложении, новое местоположение означает обновленный список близлежащих мест. Это происходит через сервисы, которые отправляют запросы к серверу и обновляют Контент-провайдер, который заполняет список мест.

Так как изменение местоположения напрямую не обновляет UI, то имеет смысл создавать и регистрировать связанный LocationChangedReceiver в манифесте, а не в Activity.

LocationChangedReceiver извлекает местоположение из каждого обновления и запускает сервис PlaceUpdateService, чтобы обновить базу близлежащих мест.

Получение данных во время автономной работы

Чтобы добавить поддержку режима offline, мы начнём с кэширования результатов поиска по PlacesContentProvider и PlaceDetailsContentProvider.

Также, при определенный обстоятельствах нужно проводить выборку сведений о местоположении. Этот фрагмент кода из сервиса PlacesUpdateService демонстрирует, как предварительная выборка включается для ограниченного количества мест.

Обратите внимание на то, что предварительная выборка данных потенциально выключается при низком заряде аккумулятора.

Похожая техника используется для реализации offline отметок.

Оптимизация времени работы аккумулятора: умные сервисы и использование состояния устройства для переключения ресиверов

Нет смысла запускать сервис обновления, когда устройство находится в автономном режиме. Сервис PlaceUpdateService проверяет возможность соединения, прежде чем пытаться получить обновление.

Если соединения нет, то ActiveLocationChangedReceiver и PassiveLocationChangedReceiver выключаются, а ConnectivityChangedReceiver включается.

ConnectivityChangedReceiver прослушивает все изменения сетевого соединения. Когда производится новое подключение, то он просто выключает себя и включает слушателей местоположения.

Мониторинг состояния аккумулятора для уменьшения функциональности и экономии энергии

Когда телефон на последних 15%, то большинство приложений не работает, для того чтобы сохранить заряд. Мы можем зарегистрировать ресиверов в манифесте, чтобы выдавать предупреждение, когда устройство входит или выходит из состояния низкой батареи.

Этот фрагмент из PowerStateChangedReceiver выключает PassiveLocationChangedReceiver всякий раз, когда устройство переходит в состояние низкого аккумулятора и включает его, когда заряд в порядке.

Можно расширить эту логику, отключив все упреждающие выборки или уменьшив частоту обновления в условиях низкого заряда аккумулятора.

Источник

Get Current Location in Android

This android tutorial is to help learn location based service in android platform. Knowing the current location in an android mobile will pave the way for developing many innovative Android apps to solve peoples daily problem. For developing location aware application in android, it needs location providers. There are two types of location providers,

  1. GPS Location Provider
  2. Network Location Provider

Any one of the above providers is enough to get current location of the user or user’s device. But, it is recommended to use both providers as they both have different advantages. Because, GPS provider will take time to get location at indoor area. And, the Network Location Provider will not get location when the network connectivity is poor.

Network Location Provider vs GPS Location Provider

  • Network Location provider is comparatively faster than the GPS provider in providing the location co-ordinates.
  • GPS provider may be very very slow in in-door locations and will drain the mobile battery.
  • Network location provider depends on the cell tower and will return our nearest tower location.
  • GPS location provider, will give our location accurately.
Читайте также:  Как удалит аккаунт google с андроида

Steps to get location in Android

  1. Provide permissions in manifest file for receiving location update
  2. Create LocationManager instance as reference to the location service
  3. Request location from LocationManager
  4. Receive location update from LocationListener on change of location

Provide permissions for receiving location update

To access current location information through location providers, we need to set permissions with android manifest file.

ACCESS_COARSE_LOCATION is used when we use network location provider for our Android app. But, ACCESS_FINE_LOCATION is providing permission for both providers. INTERNET permission is must for the use of network provider.

Create LocationManager instance as reference to the location service

For any background Android Service, we need to get reference for using it. Similarly, location service reference will be created using getSystemService() method. This reference will be added with the newly created LocationManager instance as follows.

Request current location from LocationManager

After creating the location service reference, location updates are requested using requestLocationUpdates() method of LocationManager. For this function, we need to send the type of location provider, number of seconds, distance and the LocationListener object over which the location to be updated.

Receive location update from LocationListener on change of location

LocationListener will be notified based on the distance interval specified or the number seconds.

Sample Android App: Current Location Finder

This example provides current location update using GPS provider. Entire Android app code is as follows,

XML files for layout and android manifest are as shown below

Android Output

Note: If you are running this Android app with emulator, you need to send the latitude and longitude explicitly for the emulator.

How to send latitude and longitude to android emulator

  • Open DDMS perspective in Eclipse (Window -> Open Perspective)
  • Select your emulator device
  • Select the tab named emulator control
  • In ‘Location Controls’ panel, ‘Manual’ tab, give the Longitude and Latitude as input and ‘Send’.

Comments on «Get Current Location in Android»

nice tutorial sir………..

I am a java developer but not a Android developer. I would like to develop one simple contact save application in android. Could you please publish step by step development procedure for contact book application with sqlite db interaction.

What are all requirement to run anroid applicatio

Very nice article. Steps are nicely explained. Thank you Sir

Hi,
How can i scan barcodes in android application!

yes u can use barcode scan u will find source code for barcode scan check it in github repository once i used zxing(a barcode scanner Engine)

[…] we studied about how to get current geographic location using an android application. That Android app will return latitude and longitude pair to represent current location. Instead of […]

Does this app need any type of internet .

I run the above code.but only hello world is displayed.no location data.Please specify the code for activity main.xml to display the location

Simple and Efficient..

i am new to android ,i tried the same but when i run it shows me “unfortunately app has stopped working” please help me fix this.

Very nice tutorial.Please tell me how can we use these coordinates to locate this position in the map .thank you

First you need to display the map fragment (https://javapapers.com/android/show-map-in-android/), then you need to tile these coordinates on top of it by using location service / activity.

I will post a tutorial for this exact topic very soon.

hi.
its working fine when im using emulator,but it is showing nothing when im uing it in my phone.
just hello world is outputed on the screen.

Hi,
How can i get output in phone instead of emulator because it works in emulator.

i am new to android ,i tried the same but when i run it shows me “unfortunately app has stopped working” please help me fix this

thanks alot for helping by this tutorial..
can u tell me hopw to find the direction and KMS using android google maps

I’m new to android as well and was getting the same error. What solved it was that I tried it on device and not the emulator. The emulator kept giving me error even after sending values through DDMS.

second mistake i made was i changed the name of the package and forgot to change the names in manifest. Just make sure you are not doing the same.

Worked instantly.. Thanks for the tutorial..

how to get date and time from internet in android

Very good tutorial …

Hi,
The latitude and longitude is shown, can you add the direction to the latitude and longitude like

Latitude 37.42 North
Longitude 122.56 East

Because i needed this for astrology app

Thanks Joe,for the post and for GPS Location Provider is works perfectly.

how to develop a music player stand alone application in java……?

very good tutorial…thanks sir

its working fine in emulator kindly intimate how to display in tab

Have you posted any tutorial for network based on network location service yet?

Please give URL,

very simple dear
1-install eclipse.
2-After debug the program u will the .apk file
inside Bin folder.
3-Copy the .apk file and put inside ur mobile and run it…

Читайте также:  Android безопасен или нет

dear Joe when i install apk file in Phone only
hello world message is display not lat n long find

i an new in android apps please help and suggest how to call .NET web service in this with post and get method

I think you are testing code by emulator. If yes, you need to set lattitude and longtitude manually. Its also said by author at the end of this tutorial. Please look at that and then try. Its running good for me.

great job amazing work simple easy yet effective

Nice one.
But This one is not working inside the room.we need the display the current location using network provider.

Thanks, great tutorial, best i found and works like a charm.
Can you publish one explaning GoogleMaps ?

hi , i manually added langitute and logitute .but nothing showing on my emulator..
it says only
latitute=Location not available
longitude=Location not available

This code is not working inside the room.we need the display the current location using network provider.

Great tutorial. I keep having the same problem with certain apps I write – in that they work on the emulator, but give an error on my cell phone.

App starts up then suddenly gives the message “Unfortunately, GPSapp has stopped”

Any ideas would be greatly appreciated

Galaxy S4 cell, 4.2.2

Apologies – I see this question has been raised a few times before. I have tried the suggestions above (eg make sure package name is same in program and manifest etc) but still no joy. Thanks Bryn

There can be numerous reasons to a crash. Best way to find the reason is to get the LogCat logs when it crashes. Plug the phone in USB and set it as target device. Then launch the app in phone and you can get the logs on this error.

all are incredible !

For anyone who shows “Hello World” on the mobile phone instead current location change MainActivity.java to following:

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.widget.TextView;

public class MainActivity extends Activity implements LocationListener <
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
protected LocationManager locationManager;
protected Context context;
protected boolean gps_enabled, network_enabled;
TextView txtLat;

@Override
protected void onCreate(Bundle savedInstanceState) <
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtLat = (TextView) findViewById(R.id.textview1);

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// getting GPS status
gps_enabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
network_enabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

if (gps_enabled) <
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
> else if (network_enabled) <
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
>;
>

@Override
public void onLocationChanged(Location location) <
txtLat = (TextView) findViewById(R.id.textview1);
txtLat.setText(“Latitude:” + location.getLatitude() + “, Longitude:”
+ location.getLongitude());
>

@Override
public void onProviderDisabled(String provider) <
Log.d(“Latitude”, “disable”);
>

@Override
public void onProviderEnabled(String provider) <
Log.d(“Latitude”, “enable”);
>

@Override
public void onStatusChanged(String provider, int status, Bundle extras) <
Log.d(“Latitude”, “status”);
>
>

In my code, onLocationChanged() method is not getting called while I am running my app on mobile. What may be the reason behind it?

How to send latitude and longitude to android emulator

Open DDMS perspective in Eclipse (Window -> Open Perspective)
Select your emulator device
Select the tab named emulator control
In ‘Location Controls’ panel, ‘Manual’ tab, give the Longitude and Latitude as input and ‘Send’.

For this steps we simple load a .kml file to emulator that will take a automatically from the LOCATION CONTOLS…

Thanks for a nice tutorial.Kindly help me on how to serve the obtained coordinates(latitudes&longitudes) to MySQL database.

Thank you sir…
this is very important to me. Pleas carry on your tutorials ahead.

I have seen some applications being able to retrieve the VLR Global title , something like the Node Number you are latched on , for example in Jordan it will be something like 96279123456 , but from the API i am not able to get to that level , any idea how could that have been done ?

Can anyone please help me on automatic storage of the obtained coordinates (latitude &longitude…from this tutorial)in mySQL database, this should be done without requiring the phone user to press a send button.
May God bless you for your kind assistance.
Happy coding!!

Friends,is there no one who can give a hint on this. Plz your assistance or some links/books to refer to will help me a lot.

I want to find my friend location trough googlemap
So what kind of permission i have to use in my manifest file ,is this possible??

i am working on one friend Find locater .
reply

Sir this code running well in emulator but not in phone device and itz by default shows hello world.. how can i fix it?and as like many people are geeting same problem.. pls gv us proper solution.

Its is really awesome tutorial Thank You 🙂

Sir,
i am using GPS Location find in my application and how to store in sqlite database so i am confuesd please help me sir.

i need source code

[…] said all the above, I just noticed that I have written an Android GPS tutorial already. Though I feel like a buffoon, somehow I have to manage now. Its okay, it will do no harm […]

Источник

Оцените статью