Начните работу с Places SDK для Android (Kotlin)

1. Прежде чем начать

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

Демонстрационное приложение Places

Предпосылки

  • Базовые знания Kotlin и Android-разработки

Что вы узнаете

  • Как установить Places SDK для Android с расширениями Kotlin.
  • Как загрузить сведения о месте для определенного места.
  • Как добавить виджет Place Autocomplete в ваше приложение.
  • Как загрузить текущее место на основе текущего местоположения устройства.

Что вам понадобится

Чтобы выполнить эту лабораторную работу, вам потребуются следующие учетные записи, службы и инструменты:

2. Настройте

Для шага включения, описанного ниже, включите Places API .

Настройте платформу Google Карт

Если у вас еще нет учетной записи Google Cloud Platform и проекта с включенным выставлением счетов, ознакомьтесь с руководством по началу работы с платформой Google Maps , чтобы создать платежную учетную запись и проект.

  1. В Cloud Console щелкните раскрывающееся меню проекта и выберите проект, который вы хотите использовать для этой лаборатории кода.

  1. Включите API и SDK платформы Google Maps, необходимые для этой лаборатории кода, в Google Cloud Marketplace . Для этого выполните действия, описанные в этом видео или в этой документации .
  2. Создайте ключ API на странице учетных данных Cloud Console. Вы можете выполнить действия, описанные в этом видео или в этой документации . Для всех запросов к платформе Google Maps требуется ключ API.

3. Быстрый старт

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

  1. Клонируйте репозиторий, если у вас установлен git .
git clone https://github.com/googlemaps/codelab-places-101-android.git

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

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

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

4. Установите Places SDK для Android

В этом разделе вы добавите Places SDK для Android в зависимости вашего приложения.

Добавьте свой ключ API

Предоставьте приложению созданный ранее ключ API, чтобы Places SDK для Android мог связать ваш ключ с вашим приложением.

  1. Откройте файл с именем local.properties в корневом каталоге вашего проекта (тот же уровень, где gradle.properties и settings.gradle ).
  2. Определите новый ключ GOOGLE_MAPS_API_KEY , задав его значение для созданного вами ключа API.

местные.свойства

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

Обратите внимание, что local.properties указан в файле .gitignore в репозитории Git. Это связано с тем, что ваш ключ API считается конфиденциальной информацией и, по возможности, не должен быть зарегистрирован в системе управления версиями.

  1. Затем, чтобы раскрыть свой ключ API, чтобы его можно было использовать во всем приложении, включите плагин Secrets Gradle Plugin для Android в файл build.gradle вашего приложения, расположенный в каталоге app/ , и добавьте следующую строку в блок plugins :

build.gradle на уровне приложения

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. Измените файл build.gradle на уровне проекта, включив в него следующий путь к классам:

build.gradle на уровне проекта

buildscript {
    dependencies {
        // ...
        classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
    }
}

Этот плагин делает ключи, которые вы определили в файле local.properties , доступными в качестве переменных сборки в файле манифеста Android и в качестве переменных в классе BuildConfig , сгенерированном Gradle, во время сборки. Использование этого подключаемого модуля удаляет шаблонный код, который в противном случае был бы необходим для чтения свойств из local.properties , чтобы к нему можно было получить доступ во всем приложении.

Добавьте зависимость Places SDK для Android.

  1. Теперь, когда ваш ключ API доступен внутри приложения, добавьте зависимость Places SDK для Android в файл build.gradle вашего приложения.

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

build.gradle на уровне приложения

dependencies {
   // Dependency to include Places SDK for Android
   implementation 'com.google.android.libraries.places:places:2.6.0'
}
  1. Запустите приложение.

Теперь вы должны увидеть приложение с пустым экраном. Продолжайте заполнять этот экран тремя демонстрационными примерами.

5. Установите места Android KTX

Для приложений Kotlin, использующих один или несколько Android SDK платформы Google Maps, библиотеки расширений Kotlin (KTX) позволяют использовать преимущества языковых функций Kotlin, таких как сопрограммы, свойства/функции расширений и многое другое. Каждый SDK Google Maps имеет соответствующую библиотеку KTX, как показано ниже:

Схема KTX платформы Google Maps

В этой задаче используйте библиотеку Places Android KTX, чтобы использовать языковые функции Kotlin в своем приложении.

Добавьте зависимость Places Android KTX

Чтобы воспользоваться специфическими функциями Kotlin, включите соответствующую библиотеку KTX для этого SDK в файл build.gradle на уровне приложения.

build.gradle

dependencies {
    // ...

    // Places SDK for Android KTX Library
    implementation 'com.google.maps.android:places-ktx:2.0.0'
}

6. Инициализируйте клиент Places

Инициализировать Places SDK для области приложения

В файле DemoApplication.kt app/src/main/java/com/google/codelabs/maps/placesdemo инициализируйте Places SDK для Android. Вставьте следующие строки в конец функции onCreate :

        // Initialize the SDK with the Google Maps Platform API key
        Places.initialize(this, BuildConfig.GOOGLE_MAPS_API_KEY)

Когда вы создаете свое приложение, плагин Secrets Gradle для Android делает ключ API в вашем файле local.properties доступным как BuildConfig.GOOGLE_MAPS_API_KEY .

Добавьте файл приложения в манифест

Поскольку вы расширили Application с помощью DemoApplication , вам необходимо обновить манифест. Добавьте свойство android:name в элемент application в файле AndroidManifest.xml , расположенном в app/src/main :

    <application
        android:name=".DemoApplication"
        ...
    </application>

Этот код указывает манифесту приложения на класс DemoApplication в папке src/main/java/com/google/codelabs/maps/placesdemo/ .

7. Получить информацию о месте

Создайте экран сведений

Макет LinearLayout activity_details.xml в папке app/src/main/res/layout/ . Заполните линейный макет, добавив следующий код между скобками <LinearLayout> .

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/details_input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/details_input_hint"
            android:text="@string/details_input_default" />

    </com.google.android.material.textfield.TextInputLayout>

    <Button
        android:id="@+id/details_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_details" />

    <TextView
        android:id="@+id/details_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:textIsSelectable="true" />

Этот код добавляет поле ввода текста, в котором пользователь может ввести любой идентификатор места или использовать предоставленный по умолчанию, кнопку для инициирования запроса сведений о месте и TextView для отображения информации из ответа. Связанные строки определяются для вас в файле src/main/res/values/strings.xml .

Создание действия «Подробности»

  1. Создайте файл DetailsActivity.kt в папке src/main/java/com/google/codelabs/maps/placesdemo/ и свяжите его с только что созданным макетом. Вставьте этот код в файл:
class DetailsActivity : AppCompatActivity() {
    private lateinit var placesClient: PlacesClient
    private lateinit var detailsButton: Button
    private lateinit var detailsInput: TextInputEditText
    private lateinit var responseView: TextView

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

        // Set up view objects
        detailsInput = findViewById(R.id.details_input)
        detailsButton = findViewById(R.id.details_button)
        responseView = findViewById(R.id.details_response_content)

    }
}
  1. Создайте клиент Places для использования с этим действием. Вставьте этот код после настройки объекта представления в функции onCreate .
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. После настройки клиента Places прикрепите к кнопке прослушиватель кликов. Вставьте этот код после создания Places Client в функции onCreate .
        // Upon button click, fetch and display the Place Details
        detailsButton.setOnClickListener {
            val placeId = detailsInput.text.toString()
            val placeFields = listOf(
                Place.Field.NAME,
                Place.Field.ID,
                Place.Field.LAT_LNG,
                Place.Field.ADDRESS
            )
            lifecycleScope.launch {
                try {
                    val response = placesClient.awaitFetchPlace(placeId, placeFields)
                    responseView.text = response.prettyPrint()
                } catch (e: Exception) {
                    e.printStackTrace()
                    responseView.text = e.message
                }
            }
        }

Этот код извлекает идентификатор места, который был введен в поле ввода, определяет, какие поля следует запрашивать для места, создает FetchPlaceRequest , инициирует задачу и отслеживает успех или неудачу. Если запрос выполнен успешно, функция заполняет TextView запрошенными данными.

  1. Преобразуйте FetchPlaceResponse в текст, определив функцию расширения. Файл StringUtil.kt предназначен для упрощения преобразования ответов Places SDK в удобочитаемые строки.

В конце файла DetailsActivity.kt определите функцию для преобразования объекта ответа Fetch Place в строку.

fun FetchPlaceResponse.prettyPrint(): String {
    return StringUtil.stringify(this, false)
}

Добавьте активность Details в манифест

Добавьте элемент <activity> для DetailsActivity в качестве дочернего элемента <application> в файле AndroidManifest.xml , расположенном в app/src/main :

        <activity android:name=".DetailsActivity" />

Добавьте активность Details в демонстрационное меню.

Пустой Demo модуль предназначен для отображения доступных демонстраций на главном экране. Теперь, когда вы создали действие Place Details, добавьте его в файл Demo.kt в папке src/main/java/com/google/codelabs/maps/placesdemo/ с помощью этого кода:

    DETAILS_FRAGMENT_DEMO(
        R.string.details_demo_title,
        R.string.details_demo_description,
        DetailsActivity::class.java
    ),

Связанные строки определены в файле src/main/res/values/strings.xml .

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

Запустите приложение

  1. Запустите приложение. На этот раз вы должны увидеть один элемент в списке, представляющий демонстрацию Place Details.
  2. Нажмите на текст сведений о месте. Вы должны увидеть созданное вами представление с полем ввода и кнопкой.
  3. Нажмите кнопку «ПОЛУЧИТЬ ПОДРОБНОСТИ». Если вы использовали идентификатор места по умолчанию, вы должны увидеть название места, адрес и координаты карты, как показано на рисунке 1.

Разместите действие Details с ответом

Рис. 1. Активность Place Details с отображаемым ответом.

8. Добавить автозаполнение места

Создайте экран автозаполнения

Макет activity_autocomplete.xml с пустым LinearLayout находится в папке app/src/main/res/layout/ . Заполните линейный макет, добавив этот код между скобками <LinearLayout> .

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/autocomplete_fragment"
        android:background="@android:color/white"
        android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/autocomplete_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:textIsSelectable="true" />

Этот код добавляет виджет AutocompleteSupportFragment и TextView для отображения информации из ответа. Связанные строки определены в файле src/main/res/values/strings.xml .

Создайте действие автозаполнения

  1. Создайте файл AutocompleteActivity.kt в папке src/main/java/com/google/codelabs/maps/placesdemo/ и определите его с помощью этого кода:
class AutocompleteActivity : AppCompatActivity() {
    private lateinit var responseView: TextView

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

        // Set up view objects
        responseView = findViewById(R.id.autocomplete_response_content)
        val autocompleteFragment =
            supportFragmentManager.findFragmentById(R.id.autocomplete_fragment)
                    as AutocompleteSupportFragment
    }
}

Этот код связывает действие с представлениями и AutocompleteSupportFramgent , которые вы определили в файле макета.

  1. Затем определите, что произойдет, когда пользователь выберет один из прогнозов, представленных автозаполнением места. Добавьте этот код в конец функции onCreate :
        // Specify the types of place data to return.
        autocompleteFragment.setPlaceFields(listOf(Place.Field.NAME, Place.Field.ID, Place.Field.LAT_LNG, Place.Field.ADDRESS))

        // Listen to place selection events
        lifecycleScope.launchWhenCreated {
            autocompleteFragment.placeSelectionEvents().collect { event ->
                when (event) {
                    is PlaceSelectionSuccess -> {
                        val place = event.place
                        responseView.text = StringUtil.stringifyAutocompleteWidget(place, false)
                    }
                    is PlaceSelectionError -> Toast.makeText(
                        this@AutocompleteActivity,
                        "Failed to get place '${event.status.statusMessage}'",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }

Этот код определяет, какие поля запрашивать для места, отслеживает событие выбора места и отслеживает успех или неудачу. Если запрос выполнен успешно, функция заполняет TextView сведениями о месте. Обратите внимание, что автозаполнение места возвращает объект места; нет необходимости делать отдельный запрос сведений о месте при использовании виджета автозаполнения места.

Добавьте действие автозаполнения в манифест

Добавьте элемент <activity> для AutocompleteActivity в качестве дочернего элемента <application> в файле AndroidManifest.xml , расположенном в app/src/main :

        <activity android:name=".AutocompleteActivity" />

Добавьте действие автозаполнения в демонстрационное меню.

Как и раньше, добавьте демонстрацию Place Autocomplete на главный экран, добавив ее в список в модуле Demo . Теперь, когда вы создали действие автозаполнения места, добавьте его в файл Demo.kt в папке src/main/java/com/google/codelabs/maps/placesdemo/ . Вставьте этот код сразу после элемента DETAILS_FRAGMENT_DEMO :

    AUTOCOMPLETE_FRAGMENT_DEMO(
        R.string.autocomplete_fragment_demo_title,
        R.string.autocomplete_fragment_demo_description,
        AutocompleteActivity::class.java
    ),

Связанные строки определены в файле src/main/res/values/strings.xml .

Запустите приложение

  1. Запустите приложение. На этот раз вы должны увидеть два элемента в списке главного экрана.
  2. Нажмите на строку «Место автозаполнения». Вы должны увидеть всплывающее окно ввода Place Autocomplete, как показано на рисунке 2.
  3. Начните вводить название места. Это может быть название заведения, адрес или географический регион. Прогнозы должны быть представлены по мере ввода.
  4. Выберите один из прогнозов. Подсказки должны исчезнуть, а TextView теперь должен отображать сведения о выбранном месте, как показано на рис. 3.

Автозаполнение после того, как пользователь коснется поля ввода

Рис. 2. Действие автозаполнения после того, как пользователь коснется поля ввода.

Автозаполнение после того, как пользователь набрал и выбрал &ldquo;Ниагарский водопад&rdquo;

Рис. 3. Действие автозаполнения, отображающее сведения о месте после того, как пользователь ввел и выбрал «Ниагарский водопад».

9. Получите текущее место устройства

Создать экран текущего места

Макет activity_current.xml с пустым LinearLayout был предоставлен в папке app/src/main/res/layout/ . Заполните линейный макет, добавив следующий код между скобками <LinearLayout> .

    <Button
        android:id="@+id/current_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/current_button" />

    <TextView
        android:id="@+id/current_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:scrollbars = "vertical"
        android:textIsSelectable="true" />

Создать действие «Текущее место»

  1. Создайте файл CurrentActivity.kt в папке src/main/java/com/google/codelabs/maps/placesdemo/ и определите его с помощью этого кода:
class CurrentPlaceActivity : AppCompatActivity() {
    private lateinit var placesClient: PlacesClient
    private lateinit var currentButton: Button
    private lateinit var responseView: TextView

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

        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)

        // Set view objects
        currentButton = findViewById(R.id.current_button)
        responseView = findViewById(R.id.current_response_content)


        // Set listener for initiating Current Place
        currentButton.setOnClickListener {
            checkPermissionThenFindCurrentPlace()
        }
    }
}

Этот код связывает действие с представлениями, которые вы определили в файле макета. Он также добавляет прослушиватель кликов к кнопке для вызова функции checkPermissionThenFindCurrentPlace при нажатии кнопки.

  1. Определите checkPermissionThenFindCurrentPlace() для проверки разрешения на точное определение местоположения и запроса разрешения, если оно еще не было предоставлено. Вставьте этот код после функции onCreate .
    /**
     * Checks that the user has granted permission for fine or coarse location.
     * If granted, finds current Place.
     * If not yet granted, launches the permission request.
     * See https://developer.android.com/training/permissions/requesting
     */
    private fun checkPermissionThenFindCurrentPlace() {
        when {
            (ContextCompat.checkSelfPermission(
                this,
                ACCESS_FINE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
                this,
                ACCESS_COARSE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED) -> {
                // You can use the API that requires the permission.
                findCurrentPlace()
            }
            shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)
            -> {
                Log.d(TAG, "Showing permission rationale dialog")
                // TODO: In an educational UI, explain to the user why your app requires this
                // permission for a specific feature to behave as expected. In this UI,
                // include a "cancel" or "no thanks" button that allows the user to
                // continue using your app without granting the permission.
            }
            else -> {
                // Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION
                    ),
                    PERMISSION_REQUEST_CODE
                )
            }
        }
    }

    companion object {
        private val TAG = "CurrentPlaceActivity"
        private const val PERMISSION_REQUEST_CODE = 9
    }
  1. Когда ветвь else функции checkPermissionThenFindCurrentPlace вызывает requestPermissions , приложение представляет пользователю диалоговое окно запроса разрешения. Если пользователь использует устройство под управлением ОС ниже Android 12, пользователь может предоставить только разрешение на точное (точное) определение местоположения. Если пользователь использует устройство под управлением Android 12 или более поздней версии, ему будет предоставлена ​​возможность указать приблизительное (приблизительное) местоположение вместо точного (точное), как показано на рис. 4.

Запрос разрешения пользователя на устройстве под управлением Android 12 или выше

Рисунок 4. Запрос разрешения пользователя на устройстве под управлением Android 12 или более поздней версии предоставляет возможность предоставления точного или приблизительного местоположения.

После того, как пользователь ответит на диалоговое окно системных разрешений, система вызовет реализацию вашего приложения onRequestPermissionsResult . Система передает ответ пользователя в диалоговом окне разрешений, а также код запроса, который вы определили. Переопределите onRequestPermissionResult для обработки кода запроса для разрешений местоположения, связанных с этим действием Current Place, вставив следующий код ниже checkPermissionThenFindCurrentPlace .

    @SuppressLint("MissingPermission")
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>, grantResults: IntArray
    ) {
        if (requestCode != PERMISSION_REQUEST_CODE) {
            super.onRequestPermissionsResult(
                requestCode,
                permissions,
                grantResults
            )
            return
        } else if (permissions.toList().zip(grantResults.toList())
                .firstOrNull { (permission, grantResult) ->
                    grantResult == PackageManager.PERMISSION_GRANTED && (permission == ACCESS_FINE_LOCATION || permission == ACCESS_COARSE_LOCATION)
                } != null
        )
            // At least one location permission has been granted, so proceed with Find Current Place
            findCurrentPlace()
    }
  1. После предоставления разрешения запускается функция findCurrentPlace . Определите функцию с этим кодом после функции onRequestPermissionsResult .
    /**
     * Fetches a list of [PlaceLikelihood] instances that represent the Places the user is
     * most
     * likely to be at currently.
     */
    @RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
    private fun findCurrentPlace() {
        // Use fields to define the data types to return.
        val placeFields: List<Place.Field> =
            listOf(Place.Field.NAME, Place.Field.ID, Place.Field.ADDRESS, Place.Field.LAT_LNG)

        // Use the builder to create a FindCurrentPlaceRequest.
        val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)

        // Call findCurrentPlace and handle the response (first check that the user has granted permission).
        if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // Retrieve likely places based on the device's current location
            lifecycleScope.launch {
                try {
                    val response = placesClient.awaitFindCurrentPlace(placeFields)
                    responseView.text = response.prettyPrint()

                    // Enable scrolling on the long list of likely places
                    val movementMethod = ScrollingMovementMethod()
                    responseView.movementMethod = movementMethod
                } catch (e: Exception) {
                    e.printStackTrace()
                    responseView.text = e.message
                }
            }
        } else {
            Log.d(TAG, "LOCATION permission not granted")
            checkPermissionThenFindCurrentPlace()

        }
    }

Этот код определяет, какие поля запрашивать для вероятных мест, создает FindCurrentPlaceRequest , инициирует задачу и заполняет TextView запрошенными данными.

  1. Преобразуйте FindCurrentPlaceResponse в текст, определив функцию расширения. Файл StringUtil.kt предназначен для упрощения преобразования ответов Places SDK в удобочитаемые строки.

В конце файла CurrentPlaceActivity.kt определите функцию для преобразования объекта ответа Current Place в строку.

fun FindCurrentPlaceResponse.prettyPrint(): String {
    return StringUtil.stringify(this, false)
}

Добавьте действие Current Place в манифест

Добавьте элемент <activity> для CurrentPlaceActivity в качестве дочернего элемента <application> в файле AndroidManifest.xml , расположенном в app/src/main :

        <activity android:name=".CurrentPlaceActivity" />

Добавьте действие «Текущее место» в демонстрационное меню.

Как и раньше, добавьте демо «Текущее место» на главный экран, добавив его в список в модуле « Demo ». Теперь, когда вы создали действие Current Place, добавьте его в файл Demo.kt в папке src/main/java/com/google/codelabs/maps/placesdemo/ . Вставьте этот код сразу после элемента AUTOCOMPLETE_FRAGMENT_DEMO :

    CURRENT_FRAGMENT_DEMO(
        R.string.current_demo_title,
        R.string.current_demo_description,
        CurrentPlaceActivity::class.java
    ),

Связанные строки определены в файле src/main/res/values/strings.xml .

Запустите приложение

  1. Запустите приложение. На этот раз вы должны увидеть три элемента в списке главного экрана.
  2. Нажмите на строку «Текущее место». Вы должны увидеть кнопку на экране.
  3. Нажмите кнопку. Если вы ранее не предоставляли разрешение на определение местоположения для этого приложения, должен появиться запрос на разрешение.
  4. Предоставьте приложению доступ к местоположению устройства.
  5. Нажмите кнопку еще раз. На этот раз должен появиться список до 20 ближайших мест и их вероятности, как показано на рисунке 5.

Представление вероятных совпадений Текущего места с указанным местоположением устройства.

Рис. 5. Представление вероятных совпадений текущего места с сообщенным местоположением устройства.

10. Поздравления

Вы успешно создали приложение для Android с помощью Places SDK для Android.

Что вы узнали

Что дальше?

  • Исследуйте или разветвите репозиторий android-places-demos GitHub с примерами и демонстрациями, чтобы получить больше вдохновения.
  • Узнайте из других лабораторий кода Kotlin о создании приложений для Android с помощью платформы Google Maps.
  • Помогите нам создать наиболее полезный для вас контент, ответив на следующий вопрос:

Какие еще кодлабы вы хотели бы увидеть?

Визуализация данных на картах Подробнее о настройке стиля моих карт Создание 3D-взаимодействий на картах

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