Informacje o tym ćwiczeniu (w Codelabs)
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.
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:
- Konto Google z włączonymi płatnościami.
- Android Studio Bumblebee lub nowsza.
- Usługi Google Play zainstalowane w Android Studio.
- Urządzenie z Androidem lub emulator Androida, na którym działa interfejs API Google z Androidem 8 lub nowszym (instrukcje instalacji znajdziesz w artykule Uruchamianie aplikacji w emulatorze Androida).
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.
- W Cloud Console kliknij menu projektu i wybierz projekt, którego chcesz użyć w tym ćwiczeniu z programowania.
- 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.
- 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.
- 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.
- 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ą.
- Otwórz plik o nazwie
local.properties
w katalogu głównym projektu, na tym samym poziomie, cogradle.properties
isettings.gradle
. - 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.
- 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 kataloguapp/
, i dodaj ten wiersz w blokuplugins
:
build.gradle na poziomie aplikacji
plugins {
// ...
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
- 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
- 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'
}
- 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:
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
- Utwórz plik
DetailsActivity.kt
w folderzesrc/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)
}
}
- 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)
- 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.
- Przekonwertuj
FetchPlaceResponse
na tekst, definiując funkcję rozszerzenia. Dostępny jest plikStringUtil.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ę
- Uruchom aplikację. Tym razem na liście powinna być widoczna jedna pozycja przedstawiająca prezentację miejsca.
- Kliknij tekst szczegółów miejsca. Powinien wyświetlić się utworzony przez Ciebie widok z polem do wprowadzania danych i przyciskiem.
- 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.
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
- Utwórz plik
AutocompleteActivity.kt
w folderzesrc/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.
- 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ę
- Uruchom aplikację. Tym razem na liście na ekranie głównym powinny pojawić się dwa elementy.
- Kliknij wiersz Autouzupełnianie miejsc. Powinno pojawić się wyskakujące okienko wprowadzania danych autouzupełniania, jak widać na rysunku 2.
- Zacznij wpisywać nazwę miejsca. Może to być nazwa instytucji, adres lub region geograficzny. Przewidywania powinny być wyświetlane podczas pisania.
- 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.
Rysunek 2. Autouzupełnianie po kliknięciu przez użytkownika pola do wprowadzania danych.
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
- Utwórz plik
CurrentActivity.kt
w folderzesrc/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
.
- 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 funkcjionCreate
.
/**
* 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
}
- Gdy gałąź
else
funkcjicheckPermissionThenFindCurrentPlace
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.
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()
}
- Po udzieleniu pozwolenia funkcja
findCurrentPlace
zostanie uruchomiona. Zdefiniuj funkcję za pomocą tego kodu po funkcjionRequestPermissionsResult
.
/**
* 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.
- Przekonwertuj
FindCurrentPlaceResponse
na tekst, definiując funkcję rozszerzenia. Dostępny jest plikStringUtil.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ę
- Uruchom aplikację. Tym razem na liście na ekranie głównym powinny być widoczne trzy elementy.
- Kliknij wiersz Aktualne miejsce. Na ekranie powinien być widoczny przycisk.
- Kliknij przycisk. Jeśli tej aplikacji nie przyznano wcześniej dostępu do lokalizacji, powinno wyświetlić się pytanie o uprawnienia.
- Przyznaj aplikacji uprawnienia dostępu do lokalizacji urządzenia.
- 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.
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
- Instalowanie i konfigurowanie pakietu SDK Miejsc na Androida.
- Instalowanie rozszerzeń Kotlin dla pakietu SDK Miejsc na Androida.
- Wczytuję Szczegóły miejsca.
- Dodawanie autouzupełniania miejsc.
- Pobieram aktualne miejsce.
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ć?
Czy nie masz na liście ćwiczeń z programowania? Tutaj możesz poprosić o nowy problem.