Pakiet SDK Miejsc na Androida – pierwsze kroki (Kotlin)

1. Zanim zaczniesz

Z tego modułu ćwiczeń dowiesz się, jak zintegrować pakiet SDK Miejsc na Androida z aplikacją i jak korzystać z poszczególnych funkcji tego pakietu.

Aplikacja demonstracyjna Miejsc

Wymagania wstępne

  • Podstawowa wiedza na temat programowania Kotlin i Androida

Czego się nauczysz

  • Jak zainstalować pakiet SDK Miejsc na Androida przy użyciu rozszerzeń Kotlin.
  • Jak wczytać szczegółowe informacje o konkretnym miejscu.
  • Jak dodać widżet autouzupełniania miejsc do aplikacji.
  • Jak wczytać Bieżące miejsce na podstawie obecnie zgłaszanej lokalizacji na urządzeniu.

Czego potrzebujesz

Aby ukończyć ćwiczenia z programowania, potrzebne będą następujące konta, usługi i narzędzia:

2. Konfiguracja

W kroku włączania poniżej włącz Places API.

Konfigurowanie Google Maps Platform

Jeśli nie masz jeszcze konta Google Cloud Platform ani projektu z włączonymi płatnościami, przeczytaj przewodnik Pierwsze kroki z Google Maps Platform, by utworzyć konto rozliczeniowe i projekt.

  1. W Cloud Console kliknij menu projektu i wybierz projekt, którego chcesz użyć w tym ćwiczeniu z programowania.

  1. Włącz interfejsy API i pakiety SDK Google Maps Platform wymagane w ramach tego ćwiczenia z ćwiczeń w Google Cloud Marketplace. W tym celu wykonaj czynności opisane w tym filmie lub w tej dokumentacji.
  2. Wygeneruj klucz interfejsu API na stronie Dane logowania w Cloud Console. Odpowiednie instrukcje znajdziesz w tym filmie lub w tej dokumentacji. Wszystkie żądania wysyłane do Google Maps Platform wymagają klucza interfejsu API.

3. Szybki start

Aby jak najszybciej rozpocząć, pobierz kod startowy, który ułatwi Ci przeprowadzenie ćwiczenia. Możesz też od razu przejść do rozwiązania, ale jeśli chcesz samodzielnie wykonać wszystkie kroki podczas jego budowania, czytaj dalej.

  1. Skopiuj repozytorium, jeśli masz zainstalowane narzędzie git.
git clone https://github.com/googlemaps/codelab-places-101-android.git

Możesz też kliknąć ten przycisk, aby pobrać kod źródłowy.

  1. Po pobraniu kodu otwórz projekt znajdujący się w katalogu /starter w Android Studio. Ten projekt obejmuje podstawową strukturę pliku, w której musisz ukończyć ćwiczenia z programowania. Wszystkie potrzebne informacje znajdziesz w katalogu /starter.

Jeśli chcesz zobaczyć pełny kod uruchomionego rozwiązania, możesz wyświetlić kompletny kod w katalogu /solution.

4. Instalowanie pakietu SDK Miejsc na Androida

W tej sekcji dodasz zależności miejsc na potrzeby pakietu SDK do Androida.

Dodaj klucz interfejsu API

Podaj utworzony wcześniej klucz interfejsu API do aplikacji, aby pakiet SDK Miejsc na Androida mógł powiązać Twój klucz z aplikacją.

  1. Otwórz plik o nazwie local.properties w katalogu głównym projektu, na tym samym poziomie, co gradle.properties i settings.gradle.
  2. Zdefiniuj nowy klucz GOOGLE_MAPS_API_KEY, ustawiając jego wartość na utworzony przez siebie klucz interfejsu API.

Local.properties

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

Zwróć uwagę, że plik local.properties znajduje się w pliku .gitignore w repozytorium Git. Wynika to z faktu, że klucz interfejsu API jest uważany za informacje poufne i nie należy go sprawdzać w celu kontrolowania źródła.

  1. Następnie, aby udostępnić swój klucz interfejsu API, tak aby można było go używać w całej aplikacji, umieść wtyczkę Secrets Gradle Plugin for Android w pliku build.gradle aplikacji, który znajduje się w katalogu app/, i dodaj ten wiersz w bloku plugins:

build.gradle na poziomie aplikacji

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. Zmodyfikuj plik build.gradle na poziomie projektu, tak by zawierał tę ścieżkę klasy:

build.gradle na poziomie projektu

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

Ta wtyczka sprawia, że klucze zdefiniowane przez Ciebie w pliku local.properties są dostępne jako zmienne kompilacji w pliku manifestu Androida i jako zmienne w klasie BuildConfig wygenerowanej przez Gradle. Używanie tej wtyczki usuwa kod stały, który w innym przypadku byłby potrzebny do odczytania właściwości w elemencie local.properties, aby był on dostępny w aplikacji.

Dodawanie zależności w pakiecie SDK Miejsc na Androida

  1. Skoro dostęp do klucza interfejsu API jest możliwy w aplikacji, możesz dodać do pliku build.gradle swoją aplikację zależności dla pakietu SDK Miejsc na Androida.

W projekcie wstępnym w ramach tego ćwiczenia z ćwiczeniami dodaliśmy tę zależność.

build.gradle na poziomie aplikacji

dependencies {
   // Dependency to include Places SDK for Android
   implementation 'com.google.android.libraries.places:places:2.6.0'
}
  1. Uruchom aplikację.

Powinna pojawić się aplikacja z pustym ekranem. Kontynuuj wypełnianie ekranu trzema prezentacjami.

5. Instalowanie Miejsc na Androida KTX

W przypadku aplikacji Kotlin korzystających z co najmniej jednego pakietu SDK Google Maps Platform na Androida biblioteki Kotlin (KTX) umożliwiają korzystanie z funkcji języka kotlin, takich jak współprogramy, właściwości rozszerzeń i inne funkcje. Każdy pakiet SDK Map Google ma odpowiednią bibliotekę KTX, jak pokazano poniżej:

Schemat KTX Google Maps Platform

W tym zadaniu użyj biblioteki Miejsc na Androida w KTX, aby w aplikacji używać funkcji językowych Kotlin.

Dodawanie zależności Miejsc Google na Androida KTX

Aby korzystać z funkcji związanych z Kotlin, umieść odpowiednią bibliotekę KTX dla tego pakietu SDK w pliku build.gradle na poziomie aplikacji.

build.gradle

dependencies {
    // ...

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

6. Zainicjuj klienta Miejsc

Zainicjuj pakiet SDK Miejsc dla zakresu aplikacji

Zainicjuj pakiet SDK Miejsc na Androida w pliku DemoApplication.kt folderu app/src/main/java/com/google/codelabs/maps/placesdemo. Wklej wiersze na końcu funkcji onCreate:

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

Gdy tworzysz aplikację, Tajna wtyczka Gradle na Androida sprawia, że klucz API w pliku local.properties jest dostępny jako BuildConfig.GOOGLE_MAPS_API_KEY.

Dodaj plik aplikacji do pliku manifestu

Ponieważ przedłużono Application o DemoApplication, musisz zaktualizować plik manifestu. Dodaj właściwość android:name do elementu application w pliku AndroidManifest.xml, który znajduje się w sekcji app/src/main:

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

Ten kod wskazuje plik manifestu aplikacji do klasy DemoApplication w folderze src/main/java/com/google/codelabs/maps/placesdemo/.

7. Pobierz szczegóły miejsca

Utwórz ekran Szczegóły

W folderze app/src/main/res/layout/ jest dostępny układ activity_details.xml z pustym elementem LinearLayout. Aby wypełnić układ liniowy, dodaj poniższy kod do nawiasu <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" />

Kod ten dodaje pole tekstowe, w którym użytkownik może wpisać dowolny identyfikator miejsca lub użyć podanego kodu domyślnego, przycisk służący do wysyłania żądania szczegółów miejsca oraz tekst, który wyświetla informacje z odpowiedzi. Powiązane ciągi są zdefiniowane w pliku src/main/res/values/strings.xml.

Tworzenie aktywności związanej ze szczegółami

  1. Utwórz plik DetailsActivity.kt w folderze src/main/java/com/google/codelabs/maps/placesdemo/ i powiąż go z utworzonym przed chwilą układem. Wklej ten kod do pliku:
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. Utwórz klienta Miejsc do użycia podczas tego ćwiczenia. Wklej ten kod po ustawieniu obiektu widoku w funkcji onCreate.
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. Po skonfigurowaniu klienta Miejsc dołącz do jego detektora detektor kliknięć. Wklej ten kod po utworzeniu klienta Miejsc w funkcji 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
                }
            }
        }

Pobiera on identyfikator miejsca wpisany w polu wejściowym, definiuje pola, które mają zostać zgłoszone do danego miejsca, tworzy FetchPlaceRequest, inicjuje zadanie i wysłuchuje powodzenia lub niepowodzenia. Jeśli żądanie zostanie zrealizowane, funkcja wyświetli w TextView wymagane szczegóły.

  1. Przekonwertuj FetchPlaceResponse na tekst, definiując funkcję rozszerzenia. Dostępny jest plik StringUtil.kt, który upraszcza konwertowanie odpowiedzi pakietu SDK Miejsc na ciągi zrozumiałe dla ludzi.

Na końcu pliku DetailsActivity.kt określ funkcję, która przekształca obiekt odpowiedzi na żądanie pobierania na ciąg znaków.

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

Dodaj działanie Szczegóły do pliku manifestu

Dodaj element <activity> dla elementu DetailsActivity jako elementu podrzędnego elementu <application> w pliku AndroidManifest.xml, który znajduje się w folderze app/src/main:

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

Dodaj aktywność Szczegóły do menu demonstracyjnego

Dostępny jest pusty moduł Demo, który zawiera listę dostępnych wersji demonstracyjnych na ekranie głównym. Po utworzeniu działania szczegółów miejsca dodaj je do pliku Demo.kt w folderze src/main/java/com/google/codelabs/maps/placesdemo/ za pomocą tego kodu:

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

Powiązane ciągi są zdefiniowane w pliku src/main/res/values/strings.xml.

Sprawdź, czy element MainActivity.kt utworzył widok listy uzupełniany przez iterowanie zawartości modułu Demo. Jeśli użytkownik kliknie pozycję na liście, detektor kliknięć otworzy powiązaną aktywność.

Uruchom aplikację

  1. Uruchom aplikację. Tym razem na liście powinna być widoczna jedna pozycja przedstawiająca prezentację miejsca.
  2. Kliknij tekst szczegółów miejsca. Powinien wyświetlić się utworzony przez Ciebie widok z polem do wprowadzania danych i przyciskiem.
  3. Kliknij przycisk „UZYSKAJ SZCZEGÓŁY”. W przypadku użycia domyślnego identyfikatora miejsca powinny być widoczne nazwy miejsca, adres i współrzędne geograficzne, jak przedstawiono na rysunku 1.

Aktywność dotycząca szczegółów miejsca z odpowiedzią

Rysunek 1. Aktywność szczegółów miejsca z wyświetloną odpowiedzią.

8. Dodaj autouzupełnianie miejsca

Tworzenie ekranu autouzupełniania

W folderze app/src/main/res/layout/ podano układ activity_autocomplete.xml z pustym elementem LinearLayout. Aby wypełnić układ liniowy, dodaj ten kod między nawiasami <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" />

Ten kod dodaje widżet AutocompleteSupportFragment i element TextView do wyświetlania informacji z odpowiedzi. Powiązane ciągi są zdefiniowane w pliku src/main/res/values/strings.xml.

Tworzenie działania autouzupełniania

  1. Utwórz plik AutocompleteActivity.kt w folderze src/main/java/com/google/codelabs/maps/placesdemo/ i zdefiniuj go za pomocą tego kodu:
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
    }
}

Ten kod wiąże aktywność z wyświetleniami i obiektem AutocompleteSupportFramgent zdefiniowanym w pliku układu.

  1. Następnie określ, co ma się stać, gdy użytkownik wybierze jedną z podpowiedzi wyświetlanych przez funkcję autouzupełniania miejsc. Dodaj ten kod na końcu funkcji 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()
                }
            }

Ten kod określa pola, których należy zażądać dla danego miejsca, nasłuchuje zdarzenia wyboru miejsca oraz nasłuchuje powodzenia lub niepowodzenia. Jeśli żądanie zostanie zrealizowane, funkcja wyświetli w obiekcie TextView szczegółowe informacje o miejscu. Autouzupełnianie miejsc zwraca obiekt miejsca. Podczas korzystania z widżetu Autouzupełnianie miejsca nie ma potrzeby przesyłania oddzielnego żądania szczegółów miejsca.

Dodaj działanie autouzupełniania do pliku manifestu

Dodaj element <activity> dla elementu AutocompleteActivity jako elementu podrzędnego elementu <application> w pliku AndroidManifest.xml, który znajduje się w folderze app/src/main:

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

Dodawanie aktywności autouzupełniania do menu demonstracyjnego

Tak jak wcześniej, dodaj demonstrację autouzupełniania miejsc do ekranu głównego, dołączając ją do listy w module Demo. Po utworzeniu działania autouzupełniania miejsc dodaj je do pliku Demo.kt w folderze src/main/java/com/google/codelabs/maps/placesdemo/. Wklej ten kod bezpośrednio po elemencie DETAILS_FRAGMENT_DEMO:

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

Powiązane ciągi są zdefiniowane w pliku src/main/res/values/strings.xml.

Uruchom aplikację

  1. Uruchom aplikację. Tym razem na liście na ekranie głównym powinny pojawić się dwa elementy.
  2. Kliknij wiersz Autouzupełnianie miejsc. Powinno pojawić się wyskakujące okienko wprowadzania danych autouzupełniania, jak widać na rysunku 2.
  3. Zacznij wpisywać nazwę miejsca. Może to być nazwa instytucji, adres lub region geograficzny. Przewidywania powinny być wyświetlane podczas pisania.
  4. Wybierz jedno z prognoz. Przewidywane zapytania powinny zniknąć, a w TextView powinny pojawić się szczegółowe informacje o wybranym miejscu, jak widać na rysunku 3.

Autouzupełnianie po kliknięciu pola wprowadzania danych przez użytkownika

Rysunek 2. Autouzupełnianie po kliknięciu przez użytkownika pola do wprowadzania danych.

Autouzupełnianie po wpisaniu i wybraniu pozycji &ldquo;wodospad Niiagara&rdquo;

Rysunek 3. Aktywność autouzupełniania, która zawiera szczegóły miejsca po wpisaniu i wybraniu przez użytkownika "wodospadu Niagara.

9. Pobieranie bieżącego miejsca

Utwórz ekran bieżącego miejsca

W folderze app/src/main/res/layout/ podano układ activity_current.xml z pustym elementem LinearLayout. Aby wypełnić układ liniowy, umieść poniższy kod między nawiasami <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" />

Utwórz bieżącą aktywność w miejscu

  1. Utwórz plik CurrentActivity.kt w folderze src/main/java/com/google/codelabs/maps/placesdemo/ i zdefiniuj go za pomocą tego kodu:
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()
        }
    }
}

Ten kod wiąże aktywność z widokami zdefiniowanymi w pliku układu. Dodaje też odbiornik kliknięć przycisku, który po kliknięciu wywołuje funkcję checkPermissionThenFindCurrentPlace.

  1. Określ checkPermissionThenFindCurrentPlace(), aby sprawdzić, czy dostęp do lokalizacji jest dokładny, i poprosić o pozwolenie, jeśli jeszcze nie została przyznana. Wklej ten kod po funkcji 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. Gdy gałąź else funkcji checkPermissionThenFindCurrentPlace wywołuje funkcję requestPermissions, aplikacja wyświetli użytkownikowi okno prośby o przyznanie uprawnień. Jeśli użytkownik korzysta z urządzenia z systemem operacyjnym w wersji starszej niż Android 12, może przyznać mu tylko dokładne (dokładne) uprawnienia dotyczące lokalizacji. Jeśli użytkownik korzysta z urządzenia z Androidem 12 lub nowszym, może podać przybliżoną (przybliżoną) lokalizację zamiast dokładnej (dokładnej) – jak pokazano na rysunku 4.

Prośba o zgodę użytkownika na urządzeniu z Androidem 12 lub nowszym

Rysunek 4. Prośba o zgodę użytkownika na urządzenie z Androidem 12 lub nowszym daje możliwość określenia dokładnej lub przybliżonej lokalizacji.

Gdy użytkownik odpowie na komunikat w oknie uprawnień systemu, wywoła następnie aplikację onRequestPermissionsResult Twojej aplikacji. System przekazuje odpowiedź użytkownika w oknie dialogowym uprawnień i zdefiniowany przez Ciebie kod żądania. Aby zastąpić kod żądania dostępu do lokalizacji powiązanego z bieżącą aktywnością w miejscu, onRequestPermissionResult wklej ten kod poniżej 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. Po udzieleniu pozwolenia funkcja findCurrentPlace zostanie uruchomiona. Zdefiniuj funkcję za pomocą tego kodu po funkcji 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()

        }
    }

Ten kod określa pola, które należy przesłać w celu wyświetlenia prawdopodobnego miejsca, tworzy FindCurrentPlaceRequest, inicjuje zadanie i wypełnia ViewView żądanymi informacjami.

  1. Przekonwertuj FindCurrentPlaceResponse na tekst, definiując funkcję rozszerzenia. Dostępny jest plik StringUtil.kt, który upraszcza konwertowanie odpowiedzi pakietu SDK Miejsc na ciągi zrozumiałe dla ludzi.

Na końcu pliku CurrentPlaceActivity.kt określ funkcję, która przekształci obiekt odpowiedzi bieżącego miejsca w ciąg znaków.

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

Dodaj bieżącą lokalizację miejsca do pliku manifestu

Dodaj element <activity> dla elementu CurrentPlaceActivity jako elementu podrzędnego elementu <application> w pliku AndroidManifest.xml, który znajduje się w folderze app/src/main:

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

Dodawanie bieżącej aktywności do miejsca w menu demonstracyjnym

Tak jak wcześniej, dodaj demonstrację bieżącego miejsca do ekranu głównego, dołączając ją do listy w module Demo. Po utworzeniu aktywności w bieżącym miejscu dodaj je do pliku Demo.kt w folderze src/main/java/com/google/codelabs/maps/placesdemo/. Wklej ten kod bezpośrednio po elemencie AUTOCOMPLETE_FRAGMENT_DEMO:

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

Powiązane ciągi są zdefiniowane w pliku src/main/res/values/strings.xml.

Uruchom aplikację

  1. Uruchom aplikację. Tym razem na liście na ekranie głównym powinny być widoczne trzy elementy.
  2. Kliknij wiersz Aktualne miejsce. Na ekranie powinien być widoczny przycisk.
  3. Kliknij przycisk. Jeśli tej aplikacji nie przyznano wcześniej dostępu do lokalizacji, powinno wyświetlić się pytanie o uprawnienia.
  4. Przyznaj aplikacji uprawnienia dostępu do lokalizacji urządzenia.
  5. Ponownie kliknij przycisk. Tym razem powinna wyświetlić się lista maksymalnie 20 miejsc w pobliżu oraz ich prawdopodobieństwo, jak widać na rysunku 5.

Przedstawienie prawdopodobnych dopasowań bieżącego miejsca do zarejestrowanej lokalizacji urządzenia

Rysunek 5. Wyświetlam prawdopodobne lokalizacje w bieżącym miejscu urządzenia.

10. Gratulacje

Udało Ci się utworzyć aplikację na Androida za pomocą pakietu SDK Miejsc na Androida.

Czego się nauczysz

Co dalej?

  • Aby uzyskać więcej inspiracji, zapoznaj się z repozytorium android-places-demos GitHuba na temat przykładów i demonstracji.
  • Dowiedz się więcej na temat kolejnych ćwiczeń z programowania w Kotlin na temat tworzenia aplikacji na Androida za pomocą Google Maps Platform.
  • Pomóż nam utworzyć treści, które będą dla Ciebie najbardziej przydatne, odpowiadając na pytanie poniżej:

Jakie inne ćwiczenia z programowania chcesz obejrzeć?

Wizualizacja danych na mapach Więcej informacji o dostosowywaniu stylu map Tworzenie interakcji 3D w mapach

Czy nie masz na liście ćwiczeń z programowania? Tutaj możesz poprosić o nowy problem.