- Объект Android Location возвращает значение null, когда я передаю его asyncTask
- 2 ответа
- Get Current location using FusedLocationProviderClient in Android
- Выбор текущего местоположения и просмотр подробных сведений на карте
- Как получить код
- Как настроить проект
- Как получить ключ API и активировать нужные API
- Как добавить ключ API в свое приложение
- Как создать сборку и запустить приложение
- Понимание кода
- Создание клиента Places API
- Kotlin
- Запрос доступа к данным о местоположении
- Kotlin
- Kotlin
- Добавление карты
- Kotlin
- Kotlin
- Kotlin
- Kotlin
- Как получить информацию о местоположении устройства Android и позиции карты
- Kotlin
- Как получить данные о текущем местоположении
- Kotlin
- Kotlin
- Kotlin
- Kotlin
- Сохранение состояния карты
- Kotlin
- Kotlin
- Kotlin
Объект Android Location возвращает значение null, когда я передаю его asyncTask
Я отправляю на сервер широту и долготу местоположения пользователя Android вместе с registration ID и другими параметрами как объект json в Asynctask (вложенный класс активности). Но объект Location (который имел значения в начале приложения) создан в действии как таковом.
Возвращает null в классе Asynctask. Может кто-нибудь объяснить мне, почему? Должен ли я использовать отдельный класс для получения местоположения пользователя и отправки его в другую асинтаксическую задачу или службу (что не имеет смысла с архитектурной точки зрения)?
Я получаю это из класса AsyncTask как такового:
Но когда я отлаживаю его, я получаю регистрационный идентификатор, который я отправил классу AsyncTask из другого метода. Надеюсь, я ясно выражаюсь.
Ниже показано, как я отправил регистрационный идентификатор.
2 ответа
Проблема в том, что вы отправляете два отдельных набора varargs в AsyncTask в разное время.
Вы должны отправлять все необходимые данные в AsyncTask при вызове execute() для того, чтобы данные были необходимы.
Итак, вам нужно подготовить все данные и отправить их за один вызов в execute() , примерно так:
Кроме того, нет необходимости вызывать String.valueOf() для аргументов String, которые передаются в doInBackground() , поэтому вы можете удалить эти вызовы:
Изменить: Похоже, вы должны зарегистрировать прослушиватель местоположения, чтобы явно запрашивать местоположение. Вот пример кода, который вы можете использовать в качестве ссылки для регистрации прослушивателя местоположения в своем коде:
Это разрешило исключение нулевого указателя в моем объекте Location, я получил его здесь
Источник
Get Current location using FusedLocationProviderClient in Android
Sep 4, 2018 · 4 min read
Hello to coders,
Previously we have taught you how you get current location using GPS/Network Provider. Then android has revealed FusedLocationProviderClient under GoogleApi. FusedLocationProviderClient is for interacting with the location using fused location provider.
( NOTE : To use this feature, GPS must be turned on your device. For manually ask the user to turn on GPS, please check next article)
So let’s get started for the tutorial for getting the current location.
First, add a dependency for location by play services:
Then define FusedLocationProviderClient:
Add permission in manifest.xml
Now ask for runtime permission for above android 6 OS devices
N o w, request for permission if not granted and get the result on onRequestPermissionsResult overridden method, check highlighted code below:
Here, when you allow using permission for an app, it will return to onRequestPermissionsResult method. And again get the last location and print location on textview.
Above code will work if an app has already granted the location permission
Here you can notice, why we put a condition that if(location!=null) before getting latitude-longitude. The location object may be null in the following situations:
- Location is turned off in the device settings. The result could be null even if the last location was previously retrieved because disabling location also clears the cache.
- The device never recorded its location, which could be the case of a new device or a device that has been restored to factory settings.
- Google Play services on the device have restarted, and there is no active Fused Location Provider client that has requested location after the services restarted. To avoid this situation you can create a new client and request location updates yourself.
Now if in case we can’t getting location then we have an option for request location updates. Location updates will give you continuous location at any specific time interval as per your request. Let’s move on location updates.
Here we definitely get the current location using this location updates. And once we get the location, we can also remove location continuous updates else you will get multiple locations updates. This will help you when you want to move the marker on the map as current location changes.
Now you can find some methods of location request like setPriority(), setInterval() and setFastestInterval().
- setPriority: The priority of the request is a strong hint to the LocationClient for which location sources to use. For example, PRIORITY_HIGH_ACCURACY is more likely to use GPS, and is more likely to use WIFI & Cell tower positioning, but it also depends on many other factors (such as which sources are available) and is implementation dependent.
- setInterval: Set the desired interval for active location updates, in milliseconds. The location client will actively try to obtain location updates for your application at this interval, so it has a direct influence on the amount of power used by your application. Choose your interval wisely.
- setFastestInterval: Explicitly set the fastest interval for location updates, in milliseconds. This controls the fastest rate at which your application will receive location updates, which might be faster than setInterval(long) in some situations (for example, if other applications are triggering location updates). This allows your application to passively acquire locations at a rate faster than it actively acquires locations, saving power.
Источник
Выбор текущего местоположения и просмотр подробных сведений на карте
В этом руководстве рассказывается, как определить текущее местоположение устройства Android и показать сведения об организации или другом объекте, который там находится. Следуйте руководству по созданию приложения для Android с помощью Maps SDK for Android, Places SDK for Android и поставщика геоданных из нескольких источников в Location API сервисов Google Play.
Как получить код
Версия на языке Java:
Версия на языке Kotlin:
Как настроить проект
Чтобы создать проект в Android Studio, выполните следующие действия:
Импортируйте обучающий проект:
- В Android Studio выберите Файл > Создать > Импортировать проект.
- Перейдите в каталог, где вы сохранили репозиторий с примерами Google Maps Android API версии 2 после его скачивания.
- Найдите проект CurrentPlaceDetailsOnMap. Он расположен в следующем каталоге:
PATH-TO-SAVED-REPO/android-samples/tutorials/java/CurrentPlaceDetailsOnMap (Java)
PATH-TO-SAVED-REPO/android-samples/tutorials/kotlin/CurrentPlaceDetailsOnMap (Kotlin) - Выберите каталог проекта и нажмите ОК. Теперь Android Studio создаст ваш проект с использованием инструмента сборки Gradle.
Как получить ключ API и активировать нужные API
Для выполнения этого учебного проекта вам понадобится ключ Google API, который авторизован для работы с Maps SDK for Android и Places SDK for Android.
Нажмите кнопку ниже, чтобы получить ключ и активировать API.
Более подробную информацию можно найти в полном руководстве по получению ключа API.
Как добавить ключ API в свое приложение
- Откройте файл local.properties проекта.
Добавьте приведенную ниже строку и укажите вместо YOUR_API_KEY ваш ключ API.
Плагин Secrets Gradle Plugin для Android копирует ключ API во время сборки приложения и делает его доступным в виде переменной сборки в манифесте Android.
Как создать сборку и запустить приложение
- Подключите устройство Android к компьютеру. Выполните инструкции по активации параметров для разработчиков на устройстве Android и настройте ваше приложение и систему для обнаружения этого устройства. Для настройки виртуального устройства вы также можете использовать Менеджер виртуального устройства Android (AVD). Выбирая эмулятор, убедитесь, что вы используете образ, который содержит интерфейсы Google API. Подробную информацию можно найти в руководстве по началу работы.
- В Android Studio выберите пункт меню Запустить или нажмите на значок воспроизведения, чтобы запустить свое приложение. В открывшемся окне выберите устройство.
Android Studio запустит Gradle для сборки приложения, а затем отобразит результаты на устройстве или в эмуляторе. Вы должны увидеть карту с набором маркеров, в центре которой будет ваше актуальное местоположение, как показано на иллюстрации на этой странице.
- Если карта не отображается, проверьте, получен ли ключ API и добавлен ли он в приложение как описано выше. Проверьте журнал Android Monitor в Android Studio на наличие сообщений об ошибках, касающихся ключа API.
- Если на карте отображается только один маркер, установленный на Сиднейском мосту (местоположение по умолчанию, указанное в приложении), проверьте, предоставили ли вы приложению доступ к данным о местоположении. Приложение запрашивает доступ в процессе запуска, используя шаблон, который приводится в руководстве с описанием разрешений Android. Обратите внимание, что разрешения можно также предоставить непосредственно на устройстве, выбрав Настройки > Приложения >название приложения > Разрешения > Местоположение. Подробную информацию о том, как указывать разрешения в коде, вы найдете ниже, в руководстве по запросу доступа к данным о местоположении.
- Используйте средства отладки Android Studio чтобы просмотреть журналы и выполнить отладку приложения.
Понимание кода
В этой части руководства описаны наиболее важные компоненты приложения CurrentPlaceDetailsOnMap, чтобы вы могли понять принципы создания подобного приложения.
Создание клиента Places API
Ниже указаны объекты, которые являются основными точками входа в Places SDK на платформе Android:
- Класс Places создает клиентов для Places SDK на платформе Android и управляет ими.
- Интерфейс PlaceDetectionClient устанавливает текущее местоположение устройства и мест рядом.
Интерфейс LocationServices – главная точка входа для сервисов геолокации на платформе Android.
Чтобы использовать API, выполните следующие действия в рамках метода onCreate() вашего фрагмента или действия:
- Инициализируйте объект Places .
- Создайте объект PlaceDetectionClient .
- Создайте объект FusedLocationProviderClient .
Kotlin
Запрос доступа к данным о местоположении
Чтобы в вашем приложении работали функции геолокации (в том числе кнопка Мое местоположение на карте), необходимо получить от пользователя разрешение на доступ к данным о местоположении.
Это руководство содержит код, позволяющий запросить доступ к точным данным о местоположении. Подробную информацию можно найти в руководстве по разрешениям Android.
Добавьте следующее разрешение в качестве дочернего для элемента в вашем манифесте Android:
Запросите разрешения при запуске приложения, чтобы пользователь мог принять или отклонить запрос доступа к данным о местоположении. Следующий код позволяет проверить, предоставил ли пользователь доступ к данным о точном местоположении. Если разрешение отсутствует, оно будет запрошено у пользователя.
Kotlin
Переопределите обратный вызов метода onRequestPermissionsResult() , чтобы обработать результат запроса доступа:
Kotlin
Метод updateLocationUI() мы рассмотрим ниже.
Добавление карты
Отобразите карту, используя Maps SDK для Android.
Добавьте элемент в файл макета для объекта activity, activity_maps.xml . Этот элемент указывает, что фрагмент SupportMapFragment должен выступать в роли контейнера для карты и предоставить доступ к объекту GoogleMap . В учебном проекте используется версия вспомогательной библиотеки Android для фрагмента карты, чтобы обеспечить обратную совместимость с более ранними версиями фреймворка Android.
В методе onCreate() своего объекта activity установите файл макета как представление контента.
Kotlin
Реализуйте интерфейс OnMapReadyCallback и переопределите метод onMapReady() , чтобы настроить карту, когда объект GoogleMap будет доступен:
Kotlin
В методе onCreate() своего объекта activity получите дескриптор для фрагмента карты путем вызова метода FragmentManager.findFragmentById() . Затем используйте метод getMapAsync() , чтобы зарегистрировать обратный вызов карты:
Kotlin
Разместите в коде метод updateLocationUI() , чтобы добавить на карту элементы управления. Если пользователь предоставил разрешение на использование данных о местоположении, активируйте слой «Мое местоположение» и соответствующий элемент управления на карте. В противном случае отключите их и установите для текущего местоположения значение null:
Kotlin
Как получить информацию о местоположении устройства Android и позиции карты
Обратитесь к поставщику геоданных из нескольких источников, чтобы определить последнее известное местоположение устройства. Затем используйте эти данные для позиционирования карты. В этом руководстве есть код, который вам понадобится. Дополнительную информацию о том, как определить местоположение устройства, можно найти в руководстве по работе с поставщиком геоданных из нескольких источников для Location API сервисов Google Play.
Kotlin
Как получить данные о текущем местоположении
Получить список мест, где с вероятностью может находиться устройство, можно с помощью Places SDK for Android. Место в данном случае – это компания или другой объект для посещения.
Выполните приведенные ниже инструкции, чтобы настроить показ места, когда пользователь нажимает кнопку Узнать место. Пользователь увидит список подходящих мест и сможет сделать выбор, а затем добавить на карту маркер, чтобы указать местоположение выбранного места. В этом руководстве вы найдете код для взаимодействия с Places SDK for Android. Дополнительную информацию можно найти в руководстве по получению информации о текущем месте.
- Создайте файл макета ( current_place_menu.xml ) для меню параметров и переопределите метод onCreateOptionsMenu() , чтобы настроить это меню. Ознакомьтесь с кодом в примере приложения.
- Переопределите метод onOptionsItemSelected() , чтобы получать актуальную информацию о месте, когда пользователь нажимает Узнать место:
Kotlin
Создайте метод showCurrentPlace() , чтобы получить список мест, где может находиться устройство:
Kotlin
Создайте метод openPlacesDialog() , чтобы показать форму, в которой пользователь может выбрать место из списка. Добавьте на карту маркер для выбранного места. Маркер должен содержать сведения о названии и адресе места, а также другие атрибуты, которые предоставляет API:
Kotlin
Создайте собственный макет для контента информационного окна. Это позволяет показывать в окне несколько строк. Сначала добавьте файл макета XML ( custom_info_contents.xml ), который содержит текстовое представление для заголовка информационного окна, и еще одно текстовое представление для фрагмента (иными словами, текстовый контент информационного окна).
Реализуйте интерфейс InfoWindowAdapter , чтобы развернуть макет и загрузить контент информационного окна:
Kotlin
Сохранение состояния карты
Сохраните информацию о положении камеры и местоположении устройства. Когда пользователь поворачивает устройство Android или изменяет параметры конфигурации, фреймворк Android останавливает и заново запускает объект activity для карты. Чтобы обеспечить удобство для пользователя, сохраните соответствующее состояние приложения и восстановите его при необходимости.
Это руководство содержит весь код, который необходим для сохранения состояния карты. Дополнительную информацию вы можете найти в руководстве по использованию пакета savedInstanceState .
В операции, работающей с картой, настройте основные значения для сохранения состояния объекта activity:
Kotlin
Реализуйте обратный вызов onSaveInstanceState() , чтобы сохранить состояние, когда операция будет приостановлена:
Kotlin
В методе onCreate() своей операции получите информацию о местоположении устройства и положении камеры карты, если это было ранее сохранено:
Kotlin
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Источник