Уроки на Kotlin: местоположение на карте в Android Studio

Современные смартфоны обладают функцией определения координат, и приложения всё чаще предоставляют информацию о ближайших кафе, пробках или курьерах с заказом на карте. Сегодня на занятии в Android Studio мы создадим программу, которая определит ваше местоположение и отметит его синей точкой на карте. Для этого мы будем использовать язык Kotlin, и структура урока разработана таким образом, чтобы даже новички в среде разработки смогли получить рабочий результат за полчаса.


Что понадобится для работы

Для отображения карт Google предоставляет бесплатный сервис — Google Maps Android API. Чтобы им воспользоваться, нужно получить специальный ключ в Google Cloud Console. Зайдите на сайт cloud.google.com, создайте проект, включите Maps SDK for Android и скопируйте ключ. Он выглядит как длинная строка букв и цифр. Этот ключ мы позже вставим в манифест.

Также потребуются библиотеки: сам Maps SDK и Fused Location Provider — компонент, который быстро и экономно определяет координаты устройства, используя GPS, Wi-Fi и сотовые вышки одновременно.


Подключаем библиотеки и ключ

Откройте build.gradle.kts уровня модуля app и добавьте две зависимости. На момент написания актуальна версия Maps 19.0.0 и Location 21.3.0, но уточните свежие цифры в документации.

dependencies {
    implementation("com.google.android.gms:play-services-maps:19.0.0")
    implementation("com.google.android.gms:play-services-location:21.3.0")
}

Теперь в файле AndroidManifest.xml внутри тега <application> пропишите ключ. Параллельно добавьте разрешение на доступ к геолокации — без него карта не сможет определить, где вы.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="YOUR_API_KEY" />

Размещаем карту на экране

В файле activity_main.xml добавьте элемент <fragment> с классом SupportMapFragment. Он займёт весь экран. Никаких дополнительных контейнеров не нужно — карта сама растянется.

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/map_fragment"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Получаем карту в Activity

В MainActivity.kt нужно реализовать интерфейс OnMapReadyCallback и в методе onMapReady получить объект GoogleMap. С ним мы будем взаимодействовать: двигать камеру, ставить маркер, включать слой «мой маркер».

class MainActivity : AppCompatActivity(), OnMapReadyCallback {
    private lateinit var map: GoogleMap

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map_fragment) as SupportMapFragment
        mapFragment.getMapAsync(this)
    }

    override fun onMapReady(googleMap: GoogleMap) {
        map = googleMap
        // здесь включим определение местоположения
    }
}

Включаем кнопку «Моё местоположение»

Google Maps умеет показывать синюю точку без дополнительного кода — достаточно включить слой isMyLocationEnabled. Однако прежде нужно запросить разрешение у пользователя, потому что геолокация — опасное разрешение. Создадим простой метод для проверки и запроса.

private fun enableMyLocation() {
    if (ActivityCompat.checkSelfPermission(
            this, Manifest.permission.ACCESS_FINE_LOCATION
        ) == PackageManager.PERMISSION_GRANTED
    ) {
        map.isMyLocationEnabled = true
    } else {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            1
        )
    }
}

override fun onRequestPermissionsResult(
    requestCode: Int, permissions: Array<String>, grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == 1 && grantResults.isNotEmpty()
        && grantResults[0] == PackageManager.PERMISSION_GRANTED
    ) {
        enableMyLocation()
    }
}

Вызовите enableMyLocation() в onMapReady. На карте появится кнопка, которая центрирует экран на вашей позиции. При первом запуске система спросит разрешение на доступ к геолокации.


Перемещаем камеру на координаты

Карту можно программно подвинуть в любую точку мира. Для этого создают объект LatLng (широта и долгота) и вызывают moveCamera с CameraUpdateFactory.newLatLngZoom. Например, отправим пользователя на Красную площадь.

val moscow = LatLng(55.7558, 37.6173)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(moscow, 15f))

Параметр 15 — это уровень приближения: 1 показывает весь земной шар, 20 — отдельные дома. Для города оптимально 14–16.


Ставим маркер

Маркер — это флажок на карте. Его можно добавить через addMarker, указав позицию, заголовок и описание. При нажатии на маркер появится информационное окошко.

map.addMarker(
    MarkerOptions()
        .position(moscow)
        .title("Красная площадь")
        .snippet("Центр Москвы")
)

Что мы сегодня освоили

Этот урок в среде Android Studio научил вас работать с картами и геолокацией на языке Kotlin. Вы подключили Google Maps, настроили API-ключ, запросили разрешение на доступ к координатам и вывели синюю точку на экран. Теперь вы можете добавить в своё приложение карту, отмечать на ней важные места и даже строить маршруты. Попробуйте заменить координаты Красной площади на своё текущее местоположение — это станет отличным продолжением сегодняшнего занятия.