Введение в Google Maps API для Android с Kotlin

  1. Начиная
  2. Использование API Карт Google
  3. Создание ключей API
  4. Настройка клиента слияния
  5. Пользовательские разрешения
  6. Получение текущего местоположения
  7. Тестирование эмулятора
  8. Маркеры
  9. Изменение типа карты
  10. Внедрение геокодирования
  11. Получение обновлений местоположения
  12. Поиск места
  13. Куда пойти отсюда?

Примечание об обновлении : в этом учебном курсе обновлена последняя версия API Карт Google, последняя версия Android Studio версии 3.0.1 и используется Kotlin для разработки приложений. Обновление от Джо Говарда. Оригинальный учебник Юнис Обугей.

От фитнес-приложений, таких как Runkeeper, до игр, таких как Pokemon Go, службы определения местоположения становятся все более важной частью современных приложений.

В этом руководстве Google Maps API вы создадите приложение под названием City Guide . Приложение позволяет пользователю искать местоположение, использовать Google Maps, чтобы показать адрес местоположения и прослушать изменения местоположения пользователя.

Вы узнаете, как использовать Google Maps Android API, API Google Location Services и Google Places API для Android для следующих целей:

  • Показать текущее местоположение пользователя
  • Отображать и настраивать маркеры на карте
  • Получить адрес местоположения с учетом координат
  • Слушайте обновления местоположения
  • Поиск мест
Примечание. В

этом руководстве Google Maps API предполагается, что вы уже знакомы с основами разработки под Android с помощью Kotlin. Если вы новичок в разработке для Android, прочитайте наш Начало разработки Android с Kotlin учебник, чтобы ознакомиться с основами.

Начиная

Откройте Android Studio 3.0.1 или более позднюю версию и выберите « Начать новый проект Android Studio» в меню « Быстрый запуск» или выберите « Файл / Новый проект…» :

В диалоговом окне « Создать новый проект » в представлении « Создать проект Android» введите название приложения в виде City Guide , домена компании android.raywenderlich.com , выберите предпочитаемое расположение папок для файлов проекта, убедитесь, что поддержка «Включить Kotlin» , и нажмите Далее :

В представлении « Целевые устройства Android» установите флажок « Телефон и планшет» и выберите минимальный SDK, который должно поддерживать приложение. Укажите API 16 в раскрывающемся списке «Минимальный SDK» и нажмите « Далее» .

В представлении « Добавить действие на мобильный» выберите « Активность на Google Картах» и нажмите « Далее» .

В представлении « Настройка действия» нажмите « Готово», чтобы завершить процесс создания проекта.

Android Studio будет использовать Gradle для создания вашего проекта. Это может занять несколько секунд.

Откройте MapsActivity.kt . Это должно выглядеть так:

пакет com.raywenderlich.android.cityguide import android.support.v7.app.AppCompatActivity import android.os.Bundle import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap import com .google.android.gms.maps.OnMapReadyCallback import com.google.android.gms.maps.SupportMapFragment import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.MarkerOptions Класс MapsActivity: AppCompatActivity (), OnMapReadyCallback {private lateinit var mMap: GoogleMap переопределяет fun onCreate (saveInstanceState: Bundle?) {super.onCreate (saveInstanceState) setContentView (R.layout.activity_maps) // Получение уведомлений о получении SupportMapFragment и получение уведомлений готов к использованию. val mapFragment = supportFragmentManager .findFragmentById (R.id.map) as SupportMapFragment mapFragment.getMapAsync (this)} / ** * Манипулирует картой, когда она становится доступной. * Этот обратный вызов срабатывает, когда карта готова к использованию. * Здесь мы можем добавить маркеры или линии, добавить слушателей или переместить камеру. В этом случае * мы просто добавляем маркер возле Сиднея, Австралия. * Если на устройстве не установлены сервисы Google Play, пользователю будет предложено установить его внутри SupportMapFragment. Этот метод будет активирован только после того, как пользователь * установит сервисы Google Play и вернется в приложение. * / переопределить веселье onMapReady (googleMap: GoogleMap) {mMap = googleMap // Добавить маркер в Сиднее и переместить камеру val sydney = LatLng (-34.0, 151.0) mMap.addMarker (MarkerOptions (). position (sydney) .title ( «Маркер в Сиднее»)) mMap.moveCamera (CameraUpdateFactory.newLatLng (sydney))}}

  1. В настоящее время MapsActivity реализует интерфейс OnMapReadyCallback и расширяет AppCompatActivity .
  2. Класс переопределяет метод onCreate () AppCompatActivity.
  3. Вы также переопределяете метод onMapReady () метода OnMapReadyCallback . Этот метод вызывается, когда карта готова к использованию. Код, объявленный в этом методе, создает маркер с координатами вблизи Сиднея, Австралия, и добавляет маркер на карту.

Шаблон добавляет следующее в манифесты / AndroidManifest.xml :

  1. Объявление разрешения ACCESS_FINE_LOCATION . Это необходимо для доступа к точному местоположению пользователя.
  2. Метаданные com.google.android.geo.API_KEY . Это используется для указания ключа API.

Шаблон также добавляет зависимость сервисов Google Play от build.gradle . Эта зависимость предоставляет приложениям API Карт Google и Служб определения местоположения.

реализация 'com.google.android.gms: play-services-maps: 11.8.0'

Когда сборка будет завершена, запустите приложение, чтобы увидеть, что у вас есть:

Все, что у вас есть, это пустой экран без карты; Вы еще не настроили ключ API для Карты Google. Вы сделаете это дальше.

Примечание. Если вы используете эмулятор, установленная версия эмулятора должна соответствовать версии Сервисов Google Play, необходимой в вашем файле build.gradle . Если вы видите сообщение о том, что вам нужно обновить версию эмулятора Google Play Services, вы можете либо загрузить последние версии API Google с помощью Android Studio SDK Manager и установить их на виртуальное устройство, либо уменьшить версию в зависимости от gradle.

Использование API Карт Google

Чтобы использовать любой из API Карт Google необходимо создать ключ API и включить все необходимые API из консоль разработчика , Если у вас еще нет учетной записи Google, Создай сейчас - это бесплатно!

Создание ключей API

Откройте файл res / values ​​/ google_maps_api.xml . Вы увидите следующее:

Теперь скопируйте и вставьте приведенную выше ссылку в ваш браузер.

На странице « Включить API» выберите « Создать проект» и нажмите « Продолжить» .

На странице « Включить API» выберите « Создать проект» и нажмите « Продолжить»

На следующем экране нажмите кнопку « Создать ключ API» , чтобы продолжить.

На следующем экране нажмите кнопку « Создать ключ API» , чтобы продолжить

Когда это будет сделано, скопируйте ключ API, показанный в диалоге создания ключа API, и нажмите « Закрыть» .

Когда это будет сделано, скопируйте ключ API, показанный в диалоге создания ключа API, и нажмите « Закрыть»

Вернитесь к google_maps_api.xml , замените значение ключа google_maps_key на скопированный ключ API.

Сборка и запуск снова. Вы должны увидеть карту с красным маркером на экране.

Вернуться к консоль разработчика и включите API Google Адресов для Android . Вы будете использовать это позже для поиска места:

Настройка клиента слияния

Перед добавлением любого кода Kotlin вам необходимо настроить Android Studio на автоматическое добавление операторов импорта, чтобы избавить вас от необходимости добавлять каждый из них вручную.

Перейдите в настройки Android Studio (или «Настройки на ПК») и перейдите в « Редактор»> «Основные»> «Автоматический импорт» , установите флажки « Добавить однозначный импорт на лету» и « Показать всплывающие окна импорта» и нажмите « ОК» .

Перейдите в настройки Android Studio (или «Настройки на ПК») и перейдите в « Редактор»> «Основные»> «Автоматический импорт» , установите флажки « Добавить однозначный импорт на лету» и « Показать всплывающие окна импорта» и нажмите « ОК»

Откройте MapsActivity.kt и сначала переименуйте свойство GoogleMap для сопоставления, установив на него курсор и нажав Shift + F6 :

частный латинит вар карта: GoogleMap

Откройте файл приложения build.gradle и добавьте зависимость местоположения Google Maps:

реализация 'com.google.android.gms: play-services-location: 11.8.0'

Затем добавьте FusedLocationProviderClient в MapActivity.

private lateinit var fusedLocationClient: FusedLocationProviderClient

Добавьте следующую строку кода в конец onCreate () ,

fusedLocationClient = LocationServices.getFusedLocationProviderClient (это)

Пусть MapActivity реализует интерфейс GoogleMap.OnMarkerClickListener , который определяет onMarkerClick (), вызываемый при нажатии или касании маркера:

Класс MapsActivity: AppCompatActivity (), OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

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

  1. Поместите курсор в любое место на объявлении класса и нажмите на значок красной лампочки, который появляется над объявлением класса.
  2. Выберите Реализовать участников из появившихся вариантов.
  3. В диалоговом окне « Участники агрегата» нажмите « ОК» .
  4. В диалоговом окне « Участники агрегата» нажмите « ОК»

Обновление onMarkerClick () должно быть

переопределить веселье onMarkerClick (p0: Marker?) = false

Добавьте следующий код в onMapReady () :

map.getUiSettings (). setZoomControlsEnabled (true) map.setOnMarkerClickListener (this)

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

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

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

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

Замените код Сиднея следующим кодом, чтобы установить маркер в Нью-Йорке с заголовком «Мой любимый город»:

val myPlace = LatLng (40.73, -73.99) // это Нью-Йорк map.addMarker (MarkerOptions (). position (myPlace) .title ("Мой любимый город")) map.moveCamera (CameraUpdateFactory.newLatLng (myPlace))

Сборка и запуск.

Обратите внимание, что карта автоматически центрируется по центру маркера на экране; moveCamera () делает это для вас. Тем не менее, уровень масштабирования карты не правильный, так как он полностью уменьшен.

Измените moveCamera (), как показано ниже:

map.moveCamera (CameraUpdateFactory.newLatLngZoom (myPlace, 12.0f))

Уровень масштабирования 0 соответствует полностью уменьшенному взгляду на мир. Большинство областей поддерживают уровни масштабирования до 20, в то время как более удаленные области поддерживают только уровни масштабирования до 13. Уровень масштабирования 12 - это хорошее промежуточное значение, которое показывает достаточно деталей, не сходя с ума.

Сборка и запуск, чтобы увидеть свой прогресс до сих пор.

Пользовательские разрешения

Ваше приложение нуждается в разрешении ACCESS_FINE_LOCATION для получения сведений о местоположении пользователя; Вы уже включили это в AndroidManifest.xml .

Начиная с Android 6.0, пользовательские разрешения обрабатываются немного иначе, чем раньше. Вы не запрашиваете разрешение во время установки вашего приложения; скорее вы запрашиваете их во время выполнения, когда на самом деле требуется разрешение.

Разрешения делятся на две категории: нормальный а также опасно категории. Разрешения, принадлежащие к опасной категории, требуют разрешения пользователя во время выполнения. Разрешения, которые запрашивают доступ к личной информации пользователя, такой как пользователь КОНТАКТЫ , КАЛЕНДАРЬ , МЕСТО НАХОЖДЕНИЯ и т. д. относятся к категории опасных разрешений.

Откройте MapsActivity.kt и добавьте объект-компаньон с кодом для запроса разрешения местоположения:

сопутствующий объект {private const val LOCATION_PERMISSION_REQUEST_CODE = 1}

Создайте новый метод с именем setUpMap () следующим образом.

личное развлечение }

Приведенный выше код проверяет, было ли приложению предоставлено разрешение ACCESS_FINE_LOCATION . Если это не так, то запросите его у пользователя.

Добавьте вызов setUpMap () в конце onMapReady () .

Строить и запускать; нажмите «Разрешить», чтобы предоставить разрешение.

Строить и запускать;  нажмите «Разрешить», чтобы предоставить разрешение

Примечание.

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

Получение текущего местоположения

Одним из наиболее распространенных способов использования служб определения местоположения является поиск текущего местоположения пользователя. Вы делаете это, запрашивая последнее известное местоположение устройства пользователя через API определения местоположения сервисов Google Play.

В MapsActivity.kt добавьте следующее новое свойство:

private lateinit var lastLocation: Расположение

Затем удалите код в onMapReady (), который ставит маркер в Нью-Йорке:

переопределить забаву onMapReady (googleMap: GoogleMap) {map = googleMap map.uiSettings.isZoomControlsEnabled = true map.setOnMarkerClickListener (this) setUpMap ()}

Добавьте приведенный ниже код внизу setUpMap () :

// 1 map.isMyLocationEnabled = true // 2 fusedLocationClient.lastLocation.addOnSuccessListener (this) {location -> // Получил последнее известное местоположение. В некоторых редких ситуациях это может быть нулевым. // 3 if (location! = Null) {lastLocation = location val currentLatLng = LatLng (location.latitude, location.longitude) map.animateCamera (CameraUpdateFactory.newLatLngZoom (currentLatLng, 12f))}}

Принимая каждый закомментированный раздел по очереди:

  1. isMyLocationEnabled = true включает слой my-location, который рисует голубую точку в местоположении пользователя. Он также добавляет кнопку на карту, которая при нажатии на ней центрирует карту на месте пользователя.
  2. fusedLocationClient.getLastLocation () предоставляет вам самое последнее доступное местоположение в настоящее время.
  3. Если вам удалось получить самое последнее местоположение, переместите камеру в текущее местоположение пользователя.

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

Тестирование эмулятора

Лучше всего использовать настоящее устройство Android для тестирования картографического приложения. Если по какой-либо причине вам необходимо выполнить тестирование из эмулятора, вы можете сделать это, посмеиваясь над данными местоположения в эмуляторе.

Один из способов сделать это - использовать расширенные элементы управления эмулятора. Вот как вы это сделаете:

  1. Запустите эмулятор. На правой панели щелкните значок «Дополнительно» ( ), чтобы получить доступ к расширенным элементам управления .
  2. На правой панели щелкните значок «Дополнительно» ( … ), чтобы получить доступ к расширенным элементам управления

  3. Выберите элемент « Расположение» в левой части диалогового окна « Расширенные элементы управления ».
  4. Введите значения широты и долготы в указанные поля и нажмите « Отправить» .

Введите значения широты и долготы в указанные поля и нажмите « Отправить»

Маркеры

Как вы могли заметить при последнем запуске, голубая точка на месте пользователя не очень заметна. API Карт Android позволяет использовать маркерный объект, который представляет собой значок, который можно разместить в определенной точке на поверхности карты.

В MapsActivity.kt добавьте следующий код.

личное развлечение placeMarkerOnMap (location: LatLng) {// 1 val markerOptions = MarkerOptions (). position (location) // 2 map.addMarker (markerOptions)}

  1. Создайте объект MarkerOptions и установите текущее местоположение пользователя в качестве позиции для маркера.
  2. Добавить маркер на карту

Теперь замените setUpMap () следующим:

личное развлечение map.isMyLocationEnabled = true fusedLocationClient.lastLocation.addOnSuccessListener (this) {location -> // Получил последнее известное местоположение. В некоторых редких ситуациях это может быть нулевым. if (location! = null) {lastLocation = location val currentLatLng = LatLng (location.latitude, location.longitude) placeMarkerOnMap (currentLatLng) map.animateCamera (CameraUpdateFactory.newLatLngZoom (currentLatLng, 12f))}}}

Единственное изменение, которое вы внесли в setUpMap (), это добавление вызова placeMarkerOnMap () для отображения маркера.

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

Вы должны увидеть булавку на месте пользователя:

Не нравятся булавки Android по умолчанию? Вы также можете создать маркер с пользовательским значком в качестве булавки. Вернитесь к placeMarkerOnMap () и добавьте следующую строку кода после создания экземпляра MarkerOptions :

markerOptions.icon (BitmapDescriptorFactory.fromBitmap (BitmapFactory.decodeResource (resources, R.mipmap.ic_user_location)))

Скачать пользовательские контакты с именем ic_user_location по этой ссылке и распакуйте его. Переключитесь в представление Project на панели Project и скопируйте все файлы в соответствующие папки mipmap проекта, как показано ниже.

Переключитесь в представление Project на панели Project и скопируйте все файлы в соответствующие папки mipmap проекта, как показано ниже

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

Маркер вашего местоположения теперь должен использовать иконку ic_user_location в проекте:

Что если все, что вам нужно, это пин по умолчанию, но другого цвета? Попробуйте выяснить это самостоятельно, а затем проверьте спойлер ниже, если вам нужна дополнительная помощь:
[spoiler] Добавьте эту строку кода вместо placeMarkerOnMap ():

markerOptions.icon (BitmapDescriptorFactory.defaultMarker (BitmapDescriptorFactory.HUE_GREEN))

При этом используется маркер по умолчанию, но зеленого цвета вместо красного по умолчанию.

При этом используется маркер по умолчанию, но зеленого цвета вместо красного по умолчанию

[/спойлер]

Изменение типа карты

В зависимости от функциональности вашего приложения нормальный вид карты может быть недостаточно подробным для вас.
API Карт Android предоставляет вам различные типы карт: MAP_TYPE_NORMAL, MAP_TYPE_SATELLITE, MAP_TYPE_TERRAIN, MAP_TYPE_HYBRID

Добавьте следующее внутри setUpMap () чуть ниже вызова setMyLocationEnabled ():

map.mapType = GoogleMap.MAP_TYPE_TERRAIN

GoogleMap.MAP_TYPE_TERRAIN отображает более подробный вид области, показывая изменения высоты:

MAP_TYPE_TERRAIN отображает более подробный вид области, показывая изменения высоты:

GoogleMap.MAP_TYPE_NORMAL отображает типичную дорожную карту с метками. Это тип по умолчанию. Вот как выглядят другие типы:

GoogleMap.MAP_TYPE_SATELLITE отображает спутниковую проекцию области без меток:

GoogleMap.MAP_TYPE_HYBRID отображает комбинацию спутникового и обычного режима:

Внедрение геокодирования

Теперь, когда у вас есть местоположение пользователя, было бы хорошо, если бы вы могли показать адрес этого местоположения, когда пользователь нажимает на маркер. У Google есть класс, который делает именно это: Geocoder. Это берет координаты местоположения и возвращает читаемый адрес и наоборот.

Откройте MapsActivity . Добавьте следующий метод:

private fun getAddress (latLng: LatLng): String {// 1 val geocoder = Geocoder (this) val адреса: список <адрес>? вал адрес: адрес? var addressText = "" try {// 2 address = geocoder.getFromLocation (latLng.latitude, latLng.longitude, 1) // 3 if (null! = address &&! address.isEmpty ()) {address = address [0] for (от i до 0 до address.maxAddressLineIndex) {addressText + = if (i == 0) address.getAddressLine (i) else "\ n" + address.getAddressLine (i)}}} catch (e: IOException) {Log .e ("MapsActivity", e.localizedMessage)} возвращать addressText}

Импорт для адреса неоднозначен, поэтому укажите следующий импорт для решения проблемы:

импорт android.location.Address

Вкратце, вот что происходит:

  1. Создает объект геокодера, чтобы превратить координаты широты и долготы в адрес и наоборот.
  2. Просит геокодер получить адрес из местоположения, переданного методу.
  3. Если ответ содержит какой-либо адрес, добавьте его в строку и верните.

Замените placeMarkerOnMap () следующим.

личное развлечение placeMarkerOnMap (location: LatLng) {val markerOptions = MarkerOptions (). position (location) val titleStr = getAddress (location) // добавить эти две строки markerOptions.title (titleStr) map.addMarker (markerOptions)}

Здесь вы добавили вызов getAddress () и добавили этот адрес в качестве заголовка маркера.

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

Нажмите на маркер, чтобы увидеть адрес:

Нажмите в любом месте на карте, чтобы отклонить адрес.

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

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

Получение обновлений местоположения

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

Для этого сначала нужно создать запрос местоположения.

Откройте MapsActivity . Теперь добавьте следующие свойства:

// 1 приватная латинская переменная var locationCallback: LocationCallback // 2 приватная латинитная переменная var locationRequest: LocationRequest приватная переменная locationUpdateState = false сопутствующий объект {приватное константное значение LOCATION_PERMISSION_REQUEST_CODE = 1 // 3 приватное константное значение REQUEST_CHECK_SETTINGS = 2}

  1. Объявить LocationCallback имущество.
  2. Объявить LocationRequest Недвижимость и местоположение обновлены государственной собственности.
  3. REQUEST_CHECK_SETTINGS используется в качестве кода запроса, передаваемого в onActivityResult.

Затем добавьте следующее:

приватное развлечение startLocationUpdates () {// 1 if (ActivityCompat.checkSelfPermission (this, android.Manifest.permission.ACCESS_FINE_LOCATION)! = PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions (this, arrayOf (android_FESS_OC_CENT_OC_CENT_OC_CURC_C_C_W_R_S_P_S_R__C_W_R__C_W_C_W_W_C_C_C_C_C_C_C_C_C_F_C_C_C_C_C_C_C_C_F_C_C_F_C_F_C_F_C_F_RU_RK_P_RU_RK_P_P_P_P_P_P_P_P_P_P_RU_W_P_P относится ) return} // 2 fusedLocationClient.requestLocationUpdates (locationRequest, locationCallback, null / * Looper * /)}

  1. В startLocationUpdates () , если разрешение ACCESS_FINE_LOCATION не было предоставлено, запросите его сейчас и вернитесь.
  2. Если есть разрешение, запросите обновления местоположения.

Теперь добавьте следующий метод:

личное развлечение createLocationRequest () {// 1 locationRequest = LocationRequest () // 2 locationRequest.interval = 10000 // 3 locationRequest.fastestInterval = 5000 locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY val builder = LocationSettingsRequest.BuilocationRequestRequest). // 4 val client = LocationServices.getSettingsClient (this) val task = client.checkLocationSettings (builder.build ()) // 5 task.addOnSuccessListener {locationUpdateState = true startLocationUpdates ()} task.addOnFailureListener {e - // 6 (e - ResolvableApiException) {// Настройки местоположения не удовлетворены, но это можно исправить //, показав пользователю диалоговое окно. try {// Показать диалог, вызвав startResolutionForResult (), // и проверим результат в onActivityResult (). e.startResolutionForResult (this @ MapsActivity, REQUEST_CHECK_SETTINGS)} catch (sendEx: IntentSender.SendIntentException) {// Игнорировать ошибку. }}}}

Вот что происходит в createLocationRequest ():

  1. Вы создаете экземпляр LocationRequest, добавляете его к экземпляру LocationSettingsRequest.Builder, извлекаете и обрабатываете любые изменения, которые должны быть сделаны, основываясь на текущем состоянии настроек местоположения пользователя.
  2. интервал определяет скорость, с которой ваше приложение будет хотеть получать обновления.
  3. fastestInterval указывает самую быструю скорость, с которой приложение может обрабатывать обновления. Установка скорости fasttestInterval накладывает ограничение на скорость отправки обновлений в ваше приложение.
  4. Прежде чем вы начнете запрашивать обновления местоположения, вам необходимо проверить состояние настроек местоположения пользователя.

  5. Вы создаете клиент настроек и задачу для проверки настроек местоположения.
  6. Успех задачи означает, что все хорошо, и вы можете пойти дальше и инициировать запрос местоположения.
  7. Ошибка задачи означает, что в настройках местоположения есть некоторые проблемы, которые можно исправить. Это может быть связано с отключением настроек местоположения пользователя. Вы исправите это, показав пользователю диалоговое окно, как показано ниже:
  8. Вы исправите это, показав пользователю диалоговое окно, как показано ниже:

    Теперь добавьте следующие три метода:

    // 1 переопределить fun onActivityResult (requestCode: Int, resultCode: Int, data: Intent) {super.onActivityResult (requestCode, resultCode, data) if (requestCode == REQUEST_CHECK_SETTINGS) {if (resultCode == Activity.RESULT_OK) {locationUpdateState = true startLocationUpdates ()}}} // 2 переопределяет fun onPause () {super.onPause () fusedLocationClient.removeLocationUpdates (locationCallback)} // // 3 public переопределяет fun onResume () {super.onResume () if (! locationUpdateState) {startLocationUpd ()}}

    Вот что происходит:

    1. Переопределите метод onActivityResult () AppCompatActivity и запустите запрос на обновление, если он имеет результат RESULT_OK для запроса REQUEST_CHECK_SETTINGS .
    2. Переопределите onPause (), чтобы остановить запрос на обновление местоположения
    3. Переопределите onResume (), чтобы перезапустить запрос на обновление местоположения.

    Установите LocationCallback () в onCreate (), чтобы:

    locationCallback = object: LocationCallback () {переопределить fun onLocationResult (p0: LocationResult) {super.onLocationResult (p0) lastLocation = p0.lastLocation placeMarkerOnMap (LatLng (lastLocation.latitude, lastLocation.longitude))}}

    Здесь вы обновляете lastLocation с новым местоположением и обновляете карту с новыми координатами местоположения.

    Затем добавьте вызов метода createLocationRequest () в конец onCreate () :

    createLocationRequest ()

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

    Сборка и запуск. Поиграйте с приложением, чтобы просмотреть изменения:

    Поиграйте с приложением, чтобы просмотреть изменения:

    Поиск места

    Так как это приложение должно быть руководством, пользователь должен иметь возможность искать интересующие его места, верно?

    Вот тут-то и появляется API Google Адресов; оно предоставляет вашему приложению функциональность для поиска миллионов учреждений и достопримечательностей. Это библиотека Android, которая предоставляет ряд интересных функций, одной из которых является Place Picker , который представляет собой виджет пользовательского интерфейса, который позволяет вам предоставлять функцию поиска места с помощью всего лишь нескольких строк кода. Слишком хорошо, чтобы быть правдой? Попытайся!

    Добавьте API мест в ваше приложение build.gradle :

    реализация 'com.google.android.gms: play-services-place: 11.8.0'

    Еще раз откройте MapsActivity .

    Добавьте эту константу к объекту-компаньону :

    private const val PLACE_PICKER_REQUEST = 3

    Теперь добавьте следующий метод:

    частное веселье loadPlacePicker () {val builder = PlacePicker.IntentBuilder () try {startActivityForResult (builder.build (this @ MapsActivity), PLACE_PICKER_REQUEST)} catch (e: GooglePlayServicesRepairableException) {e.printStackTrace ()} catchServiceServiceNeviceSignSignServiceNeviceSignServiceServer_Exception (Google) e.printStackTrace ()}}

    Этот метод создает новый конструктор для намерения запустить пользовательский интерфейс Place Picker, а затем запускает намерение PlacePicker.

    Теперь добавьте следующие строки кода в onActivityResult () :

    if (requestCode == PLACE_PICKER_REQUEST) {if (resultCode == RESULT_OK) {val place = PlacePicker.getPlace (this, data) var addressText = place.name.toString () addressText + = "\ n" + place.address.toString () placeMarkerOnMap (place.latLng)}}

    Здесь вы извлекаете подробности о выбранном месте, если у него есть результат RESULT_OK для запроса PLACE_PICKER_REQUEST, а затем размещаете маркер в этой позиции на карте.

    Вы почти готовы попробовать поиск по месту - вам просто нужно вызвать loadPlacePicker () внутри кода.

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

    Вернитесь к build.gradle для приложения и добавьте в качестве зависимости библиотеку поддержки Android :

    реализация 'com.android.support:design:26.1.0'

    Примечание. Как обычно, если вы используете более новую версию Android SDK, вам может потребоваться обновить версию этой зависимости, чтобы она соответствовала.

    Затем замените содержимое файла res> layout> activity_maps.xml следующими строками кода:

    <? xml version = "1.0" encoding = "utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns: android = "http://schemas.android.com/apk/res/android" android: layout_width = "match_parent" android: layout_height = "match_parent" android: fitsSystemWindows = "true"> <фрагмент android: id = "@ + id / map" class = "com.google.android.gms.maps.SupportMapFragment" android: layout_width = "match_parent" android: layout_height = "match_parent" /> <android.support.design.widget.FloatingActionButton android: id = "@ + id / fab" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android : layout_gravity = "bottom | end" android: layout_marginRight = "8dp" android: layout_marginBottom = "112dp" android: src = "@ android: drawable / ic_menu_search" /> </android.support.design.widget.CoordinatorLayout>

    Вы использовали элемент фрагмента для карты ранее; Вы сохранили это и добавили плавающую кнопку действия.

    В MapsActivity добавьте следующие строки кода в onCreate () :

    val fab = findViewById <FloatingActionButton> (R.id.fab) fab.setOnClickListener {loadPlacePicker ()}

    Сборка и запуск. Теперь, когда вы нажмете кнопку поиска внизу карты, загрузчик мест будет загружен:

    Куда пойти отсюда?

    Вы можете скачать окончательный проект из этого урока Вот , Не забудьте указать действительный ключ API Карт Google в google_maps_api.xml при запуске финального проекта.

    Этот учебник по API Карт Google только показал, что вы можете сделать с помощью API Карт Google. Официальная документация Google имеет гораздо больше о веб-сервисы а также и Android API здесь ,

    Вы также можете проверить страницу разработчика о других способах настроить маркер , Проверка разрешений для пользователей во время выполнения требует лучшей реализации, чем то, что вы делали в этом руководстве Google Maps API; Документы также имеют отличную информацию о более продвинутом разрешении выдачи здесь ,

    Посетите страницы разработчиков для подробного прочтения Google Places API для Android , получение обновлений местоположения и насмешливые данные о местоположении через расширенные элементы управления эмулятора ,

    Если у вас есть какие-либо вопросы или комментарии, пожалуйста, не стесняйтесь присоединиться к обсуждению на форуме ниже!

Похожие

Добавьте Google Maps Схема проезда на ваш сайт
Несмотря на то, что существует так много картографических приложений и сервисов, которые доставят вас из точки А в точку Б, непревзойденным королем карт является Google Maps. Я использую его на своем компьютере, планшете и 90% времени на своем смартфоне. Он имеет лучшие данные, большинство вариантов навигации и маршрутизации, а также интересные функции, такие как просмотр улиц и пешеходных прогулок, информация о велосипедах и общественном транспорте. Но что, если вам нужно использовать
10 лучших живых обоев для Android
Живые обои не совсем то, что было раньше. Когда-то считавшийся «одной из функций, которых нет у продуктов Apple», он с тех пор немного упал в безвестность. Это не значит, что живые обои не имеют фанатов. Последовательность культа огромна и определенно ощутима. Существует множество живых обоев, и мы рассмотрим десять лучших приложений для Android с живыми обоями.
Как использовать встроенный файловый менеджер Android 6.0
... Google по-прежнему хочет скрыть файловую систему от большинства людей. Но файловый менеджер позволяет вам просматривать, удалять, искать, открывать, делиться, копировать и делать все остальное, что вы хотите сделать со своими файлами. Доступ к Android 6.0 в скрытом файловом менеджере Чтобы получить доступ к этому диспетчеру файлов, откройте приложение «Настройки Android» в ящике приложения. Нажмите «Хранение и USB» в категории «Устройства».
Как настроить Android TV box в 2018 году, чтобы получить лучший опыт
Руководство по настройке Android-бокса Мы собираемся помочь вам настроить коробку Android TV в 2018 году В этом посте мы собираемся показать, как получить ОЧЕНЬ ЛУЧШИЙ опыт из ТВ-бокса в 2018 году. Мы также собираемся рассказать о том, как получить максимальную отдачу от Kodi,
Играй в Warcraft 3 на своем современном ПК
Приносим извинения за неудобства, но не могли бы вы отключить блокировку рекламы? Наши объявления актуальны и ненавязчивы, они появляются только сверху и сбоку, а не в содержании. Они также не включают
Как скачать Google Книги в виде файла PDF [Mac]
<firstimage = ”// static.makeuseof.com/wp-content/uploads/2010/02/gbd.png” /> Google предлагает самые крутые сервисы. Каждый раз, когда я смотрю на разнообразие вещей, которые он может сделать, у меня отвисает челюсть. Если вы не согласны со мной, просто подумайте. Эта маленькая компания начала удивлять нас, предоставив самый большой почтовый ящик в истории.
19+ Google Web Fonts - Скачать бесплатно в формате TTF, OTF
Google - это поисковая система, которая постоянно совершенствует свой сервис предоставления информации людям по всему миру. Благодаря влиянию технологий, есть веб-шрифты Google, разработанные для веб-сайтов, чтобы сделать их более персонализированными и потрясающими. По мере расширения, более двадцати одного Лучшие веб-шрифты Google были созданы, чтобы предложить различные стили типографии помимо
6 причин, почему я люблю использовать KDE Connect в Ubuntu
Мне нравится использовать KDE Connect в Ubuntu с апплетом индикатора приложения. Это самый простой способ подключить мой телефон Android к моему рабочему столу Linux. Теперь это вдвое больше, поскольку у него (еще раз) есть отличный индикатор Unity, интеграция
Включить темную тему YouTube на Android без рута или модифицированных APK
Еще в марте Google объявил, что мобильное приложение YouTube для Android и iOS бы получить темный режим , Эта темная тема появилась для пользователей iOS почти сразу, но потребовались месяцы, чтобы достичь версии для Android. На самом деле, Google только недавно начал тестирование темная тема для нескольких пользователей. Для тех из вас,
Новое вредоносное ПО пытается воспользоваться популярностью Opera как альтернативы мобильному браузеру на смартфо...
Новое вредоносное ПО пытается воспользоваться популярностью Opera как альтернативы мобильному браузеру на смартфонах Android. Киберпреступники создали новый вариант Opfake, который включает в себя настоящую версию Opera Mini 6.5, чтобы еще больше
4 способа отключить надоедливые уведомления на телефоне Android или iPhone
Итак, вы стараетесь связаться с другом за чашкой кофе, но вы не можете не заметить пульсирующий сигнал на сенсорном экране вашего телефона. Что делать, если ваша няня пытается связаться с вами, или неприятное письмо от вашего босса? Вы тайком разблокируете свой телефон, чтобы увидеть, о чем идет речь, - и просто так вы становитесь одним из тех людей, которые не могут держать руки подальше от своих трубок, даже если перед ними стоит человек из плоти и крови. (О, и это сообщение на экране?

Комментарии

Но что, если другой пользователь добавил к вашей визитной карточке Google фотографию, которой вы не гордитесь?
Но что, если другой пользователь добавил к вашей визитной карточке Google фотографию, которой вы не гордитесь? Ответ о том, как удалить такие фотографии позже в этой статье. Я приглашаю тебя 🙂 Как пользователи Google Map размещают фотографии на визитных карточках? Очень просто. Независимо от того, используют ли они смартфон или, традиционно, компьютер, они могут размещать фотографии. Через Google Карты. На визитке каждой компании есть кнопка Добавить фото. И именно он,
Начиная с продукта, который никому не нужен и никому не нужен?
Начиная с продукта, который никому не нужен и никому не нужен? ». Для нас, маркетологов, это может быть правильным, если бы вы называли меня Измаилом. Если вам когда-либо приходилось крутить себя и свою команду в крендель, чтобы раскрутить продукт или услугу, тогда Вы были в этом положении. Решением для этого условия является разработка соответствия продукта рынку, что означает, что вы адаптируете свой продукт, чтобы он соответствовал вашему рынку, а не наоборот. Недостаточная приспособленность
Куда бежать?
Куда бежать? Если вы пурист Microsoft, который чувствует дискомфорт и зуд в момент, когда он вынужден пользоваться услугами других компаний, заинтересуйтесь операционной системой Android. Я не пытаюсь разоблачить поклонников айфонов, iOS просто не позволяет из-за ограничений такой глубокой интеграции приложений - Microsoft и не только - с операционной системой. Хотя стоит отметить, что и для iOS доступен широкий спектр услуг и программного обеспечения Microsoft, и пользователи iPhone
Но что, если вам нужно использовать карту или маршруты за пределами сайта Google?
Но что, если вам нужно использовать карту или маршруты за пределами сайта Google? Предположим, у вас есть собственный свадебный веб-сайт или личный блог, и гости могут посетить ваш сайт, ввести адрес, с которого они будут приходить, и автоматически получить направление к месту проведения мероприятия! Ну, есть несколько способов сделать это. Самый простой способ - просто вставить карту на свою веб-страницу, используя код для вставки, созданный Google Maps. Второй способ более технический,
Каков баланс между внешними действиями (на стороне клиента) и внутренними действиями (на стороне организации)?
Каков баланс между внешними действиями (на стороне клиента) и внутренними действиями (на стороне организации)? Кто будет использовать эту карту путешествия? Правила создания успешных карт путешествий Успешные карты путешествий требуют больше, чем просто включение «правильных» элементов. Составление схемы путешествия должно быть совместным процессом, основанным на четко определенных целях и построенным на результатах исследований. Требуется усердная работа, чтобы
Каковы преимущества сравнения сайтов для клиента?
Каковы преимущества сравнения сайтов для клиента? Есть причина, почему сайты сравнения так популярны среди потребителей. Проверка товара в Интернете позволяет сравнивать предложения многих продавцов, узнавать цены, описание товара, наличие или варианты доставки - все в одном месте. Большим преимуществом является также система мнений потребителей. Клиенты с большей вероятностью выберут торговое предложение, которое будет содержать множество положительных отзывов, поскольку оно делает
Но в свете слов людей из Google, это имеет больше смысла?
Но в свете слов людей из Google, это имеет больше смысла? Вот фрагмент обсуждения в Твиттере (все после нажатия на следующий твит): Похоже, вы можете спокойно создать отличный сайт с уникальным контентом и занимать высокие позиции в поисковых системах, не обмениваясь ссылками и не создавая активных ссылок. Мораль в том, что ты должен быть честным. источник: поисковая система Круглый стол -
Боты Google теперь заряжены задавать вопросы например, «Правильно ли отредактирована статья, или она выглядит неаккуратной или наспех подготовленной?
У вас есть вопрос о фотографии на визитках в Google? Пожалуйста, напишите в комментарии ниже 🙂 Плоская графика
4. Что скажете о Что скажете о AMP (Google ускоренных мобильных страниц) для сайта?
4. Что скажете о Что скажете о AMP (Google ускоренных мобильных страниц) для сайта? 5. Что порекомендуете новичкам? С чего лучше начать? 6. Какие технологии будут оставаться в тренде для создания сайтов? 7. Лучший пример сайта, по вашему мнению? Почему? 8. Насколько необходимым будет наличие мобильного приложения для сайта? Игорь, CEO веб-студии Impulse Design (Киев)
Поможет ли вам какое-либо изменение инструментов на работе или, скорее, затруднит?
Поможет ли вам какое-либо изменение инструментов на работе или, скорее, затруднит? Посмотрите на вашу рабочую среду: вы работаете с другими? Если да, то какие инструменты они используют? Сможете ли вы сотрудничать с ними после смены платформы? Мои ответы на эти вопросы выглядят так: Мне нужен компьютер обслуживающий 90% время для стационарной работы. Суточная нагрузка состоит в основном из: много часов написания и редактирования

SaveInstanceState: Bundle?
P0: Marker?
Вал адрес: адрес?
Слишком хорошо, чтобы быть правдой?
Encoding = "utf-8"?
Что делать, если ваша няня пытается связаться с вами, или неприятное письмо от вашего босса?
О, и это сообщение на экране?
Но что, если другой пользователь добавил к вашей визитной карточке Google фотографию, которой вы не гордитесь?
Я приглашаю тебя 🙂 Как пользователи Google Map размещают фотографии на визитных карточках?
Начиная с продукта, который никому не нужен и никому не нужен?