Получить местоположение Android Kotlin
Я недавно добавил функцию определения местоположения. Когда я пытаюсь показать долготу и широту, он возвращает ноль.
Это мой класс LocationListener:
И это моя функция GetUserLocation:
И это моя функция, чтобы вернуть мою долготу и широту:
6 ответов
Когда GetUserLocation возвращается, locationManager выходит из области видимости и, по-видимому, уничтожается, препятствуя вызову onLocationChanged и предоставляя обновления.
Кроме того, вы определили mylocation внутри GetUserLocation , так что это также выходит за рамки и дополнительно убивает любой шанс или ваше получение обновления.
Вы не показали, где и как объявляется внешний mylocation (за пределами GetUserLocation ), но как бы он ни объявлялся, он скрывается тем, что внутри GetUserLocation . Так что вы не получаете много.
Вот пример того, как вы можете это сделать. (Переменная thetext определена в макете XML и доступна с помощью расширений Kotlin.)
Я прочитал много ответов, но вопрос — получить только последнее известное местоположение. С приемником он постоянно отправляет широту и долготу, у меня есть решение для этого в kotlin .. Дайте разрешения
В 2019 году лучшее официальное решение в Котлине
Google API Client / FusedLocationApi устарели, а Location Manager вообще бесполезен. Поэтому Google предпочитает объединенный провайдер определения местоположения, используя API определения местоположения сервисов Google Play «FusedLocationProviderClient» используется для определения местоположения и его лучшего способа экономии заряда аккумулятора и точности
Вот пример кода в kotlin для получения последнего известного местоположения / одноразового местоположения (эквивалент текущего местоположения)
Если ваше приложение может постоянно отслеживать местоположение, вы должны получать обновления получения местоположения .
Проверьте образец для этого в kotlin
Убедитесь, что вы позаботились о разрешении Mainfaist и разрешении времени выполнения для местоположения
И для Gradle добавить это
Для более подробной информации следуйте этим официальным документам
Получить местоположение с адресом в Android Kotlin
Добавьте эту строку в зависимости
Добавьте это в AndroidManifest
Скопируйте этот код ниже в свой класс
Запустите свой код и проверьте журнал, Happy Coding
Я знаю, что уже поздно, но теперь Google упростил использование. На сайте разработчика написано, что вам нужно создать клиента:
Тогда на создание получим провайдера:
И, наконец, чтобы узнать ваше последнее местоположение, просто позвоните:
* Протестировано с этой реализацией для определения местоположения (настройка в файле приложения вашего приложения)
Для получения дополнительной информации, проверьте эту ссылку:
Я хотел бы помочь кому-то, кто пытается получить местоположение с нуля. Вот ссылка: Получить текущее местоположение Kotlin
Код сначала проверит, включено или выключено местоположение в устройстве, а затем выберет широту и долготу и будет постоянно обновлять его.
Источник
Полный список
— получаем данные о местоположении
Android устройства могут предоставить нам данные по нашему текущему местоположению. Это, конечно, очень удобно и вовсю используется для, например, пользования картой, получения актуальной для вашей местности информации (прогноз погоды), всевозможных чекинов и пр.
Реализация этого всего вполне проста. Мы вешаем слушателя на провайдера и получаем данные. На данный момент есть два провайдера: GPS и Network.
GPS – тут все понятно, это данные с GPS-спутников.
Network – это координаты, которые можно получить через сотовую связь или WiFi. Для этого провайдера нужен инет.
Напишем простое приложение, которое будет запрашивать и отображать координаты.
Project name: P1381_Location
Build Target: Android 2.3.3
Application name: Location
Package name: ru.startandroid.develop.p1381location
Create Activity: MainActivity
В strings.xml добавим строки:
Несколько TextView, в которые мы будем выводить данные, и кнопка для открытия настроек местоположения.
В onCreate определяем TextView-компоненты и получаем LocationManager, через который и будем работать.
В onResume вешаем слушателя с помощью метода requestLocationUpdates. На вход передаем:
— тип провайдера: GPS_PROVIDER или NETWORK_PROVIDER
— минимальное время (в миллисекундах) между получением данных. Я укажу здесь 10 секунд, мне этого вполне хватит. Если хотите получать координаты без задержек – передавайте 0. Но учитывайте, что это только минимальное время. Реальное ожидание может быть дольше.
— минимальное расстояние (в метрах). Т.е. если ваше местоположение изменилось на указанное кол-во метров, то вам придут новые координаты.
— слушатель, объект locationListener, который рассмотрим ниже
Также здесь обновляем на экране инфу о включенности провайдеров.
В onPause отключаем слушателя методом removeUpdates.
locationListener – слушатель, реализует интерфейс LocationListener с методами:
onLocationChanged – новые данные о местоположении, объект Location. Здесь мы вызываем свой метод showLocation, который на экране отобразит данные о местоположении.
onProviderDisabled – указанный провайдер был отключен юзером. В этом методе вызываем свой метод checkEnabled, который на экране обновит текущие статусы провайдеров.
onProviderEnabled – указанный провайдер был включен юзером. Тут также вызываем checkEnabled. Далее методом getLastKnownLocation (он может вернуть null) запрашиваем последнее доступное местоположение от включенного провайдера и отображаем его. Оно может быть вполне актуальным, если вы до этого использовали какое-либо приложение с определением местоположения.
onStatusChanged – изменился статус указанного провайдера. В поле status могут быть значения OUT_OF_SERVICE (данные будут недоступны долгое время), TEMPORARILY_UNAVAILABLE (данные временно недоступны), AVAILABLE (все ок, данные доступны). В этом методе мы просто выводим новый статус на экран.
Провайдеры включаются и отключаются в настройках системы. Тем самым, просто определяется доступен ли провайдер для получения от него координат. Чуть позже увидим, как можно отправить юзера в эти настройки. Программное включение/выключение провайдеров через стандартные методы недоступно.
Далее идут свои методы.
showLocation на вход берет Location, определяет его провайдера методом getProvider и отображает координаты в соответствующем текстовом поле.
formatLocation на вход берет Location, читает из него данные и форматирует из них строку. Какие данные он берет: getLatitude – широта, getLongitude – долгота, getTime – время определения.
checkEnabled определяет включены или выключены провайдеры методом isProviderEnabled и отображает эту инфу на экране.
Метод onClickLocationSettings срабатывает по нажатию кнопки Location settings и открывает настройки, чтобы пользователь мог включить или выключить провайдер. Для этого используется Intent с action = ACTION_LOCATION_SOURCE_SETTINGS.
Осталось в манифесте прописать разрешение на определение координат — ACCESS_FINE_LOCATION, которое позволит нам использовать и Network и GPS. Также существует разрешение ACCESS_COARSE_LOCATION, но оно дает доступ только к Network-провайдеру.
С кодом все, давайте смотреть, что получилось. Все сохраняем и запускаем приложение.
У меня на планшете сейчас выключен GPS, выключен WiFi, вставлена симка и выключен мобильный интернет.
Запускаю приложение и вижу такую картину:
GPS выключен, Network включен. Но инета нет, поэтому Network мне ничего не дает. Надо включить либо мобильный инет, либо WiFi.
Я включаю WiFi. Проходит секунд 15-20 и инфа с Network пошла
Видим широту, долготу и время.
Напомню, что мы ставили минимальную скорость обновления – 10 сек. Но у меня провайдер Network выдает данные не чаще, чем раз в минуту.
Теперь давайте включим GPS. Для этого мы специально повесили кнопку Location settings, которую надо будет нажать пользователю, чтобы перейти в настройки. Жмем кнопку.
Видим, что GPS выключен, а Network включен. Наше приложение показывало все верно.
Разумеется, GPS можно включать и выключать через быстрые настройки системы (справа сверху). Но не все пользователи об этом знают. А тут мы их точно направим.
Включаем GPS и жмем Назад, чтобы вернуться в приложение.
GPS теперь показывает что он включен, ждем координаты. Для этого имеет смысл подойти к окну, больше вероятности, что поймаем сигнал.
В итоге сигнал пойман и получен результат.
У GPS через какое-то время включился статус 2 (AVAILABLE).
А у Network тишина со статусом. Не знаю, нормально это или нет.
Если с GPS сигналом все ок, то каждые 10 сек вы будете получать инфу о вашем местоположении. Если убрать планшет от окна, получим плохой сигнал: данные могут приходить реже и статус у меня иногда меняется на 1 (TEMPORARILY_UNAVAILABLE).
Прочее
Есть еще третий тип провайдера — PASSIVE_PROVIDER. Сам по себе этот провайдер никакие данные не вернет. Но повесив на него слушателя, вы сможете получать данные о местоположении, когда кто-то еще в системе пытается определить местоположение через обычные провайдеры. Система будет дублировать результаты и вам.
Метод getAllProviders вернет вам список всех доступных провайдеров. Метод getProviders(boolean enabledOnly) вернет либо все, либо только включенные.
Объект Location кроме координат, времени и провайдера имеет еще несколько атрибутов, которые могут прийти и пустыми:
getAccuracy – точность показания в метрах
getAltitude – высота над уровнем моря в метрах
getSpeed – скорость движения в м/с
getBearing – насколько я понял, это угол, на который текущая траектория движения отклоняется от траектории на север. Он же азимут.
Местоположение можно протестировать и через AVD эмулятор. Для этого надо в Eclipse открыть DDMS (Window > Open Perspective > DDMS) и выбрать вкладку Emulator Control. Внизу будет вкладка Manual, на которой есть поля для ввода координат и кнопка отправки.
На следующем уроке:
— создаем приложение с картой
— настраиваем карту и обрабатываем ее события
— программно меняем положение камеры
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Получение координат gps kotlin android
GPS location tracker works with the help of Google Play services, which facilitates adding location awareness to an application with automated location tracking, geofencing, and activity recognition that returns a location object. The location object represents a geographic location which consists of latitude, longitude, timestamp, and other information.
In this post, we’ll show you how can use GPS location to get the address of a place. The sample app we will build first get latitude and longitude of your location and display address. When you move the camera of google map. It will display the address of another location that is the center of google map. The final output of example will look like below:
So, let’s start the development of this sample with the help of following steps.
Creating a new Project
1. Create a new project in Android Studio from File ⇒ New Project and select Basic Activity from templates. I have given my package name as com.devlibs.googlemapaddress.
2. Open app/build.gradle and add the following dependencies.
here, we using easypermissions to handle run time google map permission.
3. The next step is to add the permissions in the Android Manifest to request user’s locations. We will use the location permission later when we request for your location. For that, you need to add ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permission. Here, you can see complete required changes in mainfest.xml.
4. Now create an intent service FetchAddressIntentService.kt to get the address by passing latitude and longitude of a location. As you can see above, we have added it in the application manifest.xml file. The definition of this file has explained in the file with the help of yellow color.
as you see above, the deliverResultToReceiver method returning an address of latitude and longitude.
5. Here, we have the main code snippet of this project. We have created GPSTrackerPresenter.kt file. It is a util class that tracks your location on given param. You can set minimum time and distance. The minimum duration and distance is a type of filter to avoid your location callback functions from being called too frequent.
- Minimum time of 1000 milliseconds means, after getting a location, you are going to get next location from the LocationManager roughly after 1000 milliseconds .
- The minimum distance of 1-meter means, after getting a location, you are getting next location after you have moved roughly 1-meter.
These two filters are combined inside the LocationManager in the way you are going to get a location after “one of the” two conditions are filled.
For example:- If you are standing up and not moving, the new location is obtained after 1 second even though you’ve not moved 1 meter yet. On the other hand, if you are running fast, you are getting a new location after you’ve moved 1 meter even though you’ve moved 1 meter within 0.5 seconds.
Here, we have a complete GPS location tracker class that we have defined inside the class with the help of yellow color.
6. Now, we are going to create a user interface to display the location that will be returned by the API. Once you get location, we’ll start our service to get the address as shown above. Open the layout file of your main activity (activity_main.xml) and add the below code to achieve the layout.
7. Now open MainAcitivty.kt file and write google map initialization code and handle GPS location object to get an address. As shown above.
Finally, merge all code and run the application. If our user does not grant permission to access fine location or coarse location, our app will request this permission and enabled their location services for our app.
If you have followed the article carefully, you can see the app running very smoothly as shown in the above. But if you face any problem.
Источник