Informationen zu diesem Codelab
1. Vorbereitung
In diesem Codelab lernen Sie, wie Sie das Places SDK for Android in Ihre App einbinden und die einzelnen Funktionen des Places SDK verwenden.
Vorbereitung
- Grundkenntnisse in der Entwicklung von Kotlin und Android
Lerninhalte
- Das Places SDK for Android mit Kotlin-Erweiterungen installieren.
- Ortsdetails für einen bestimmten Ort laden
- Place Autocomplete-Widget in Ihre App einfügen
- Wie der aktuelle Ort basierend auf dem aktuell gemeldeten Standort geladen wird
Voraussetzungen
Für dieses Codelab benötigen Sie die folgenden Konten, Dienste und Tools:
- Sie haben ein Google-Konto mit aktivierter Abrechnung.
- Android Studio Bumblebee oder höher
- Google Play-Dienste, die in Android Studio installiert sind
- Ein Android-Gerät oder ein Android Emulator, auf dem die Google APIs-Plattform auf Basis von Android 8 oder höher ausgeführt wird. Eine Anleitung zur Installation finden Sie unter Apps im Android Emulator ausführen.
2. Einrichten
Aktivieren Sie zum Aktivieren unten die Places API.
Google Maps Platform einrichten
Wenn Sie noch kein Google Cloud Platform-Konto und kein Projekt mit aktivierter Abrechnung haben, lesen Sie den Leitfaden Erste Schritte mit der Google Maps Platform, um ein Rechnungskonto und ein Projekt zu erstellen.
- Klicken Sie in der Cloud Console auf das Drop-down-Menü für Projekte und wählen Sie das Projekt aus, das Sie für dieses Codelab verwenden möchten.
- Aktivieren Sie im Google Cloud Marketplace die für dieses Codelab erforderlichen Google Maps Platform APIs und SDKs. Folgen Sie dazu der Anleitung in diesem Video oder dieser Dokumentation.
- Generieren Sie in der Cloud Console auf der Seite Anmeldedaten einen API-Schlüssel. Folgen Sie der Anleitung in diesem Video oder dieser Dokumentation. Für alle Anfragen an die Google Maps Platform ist ein API-Schlüssel erforderlich.
3. Schnelleinstieg
Für einen schnellen Einstieg können Sie den Startcode herunterladen, um in diesem Codelab Schritt zu halten. Sie können gerne zur Lösung wechseln. Wenn Sie die Schritte aber selbst ausführen möchten, lesen Sie einfach weiter.
- Wenn Sie
git
installiert haben, klonen Sie das Repository.
git clone https://github.com/googlemaps/codelab-places-101-android.git
Alternativ können Sie auf diese Schaltfläche klicken, um den Quellcode herunterzuladen.
- Nachdem du den Code heruntergeladen hast, öffne das Projekt im Verzeichnis
/starter
in Android Studio. Dieses Projekt enthält die grundlegende Dateistruktur, die Sie im Codelab absolvieren müssen. Alles, was du brauchst, findest du im Verzeichnis/starter
.
Wenn Sie den vollständigen Lösungscode sehen möchten, können Sie sich den abgeschlossenen Code im Verzeichnis /solution
ansehen.
4. Places SDK for Android installieren
In diesem Abschnitt fügen Sie den Places SDK for Android den Abhängigkeiten Ihrer App hinzu.
Eigenen API-Schlüssel hinzufügen
Geben Sie den API-Schlüssel an, den Sie zuvor für die App erstellt haben, sodass der Places SDK for Android Ihren Schlüssel mit Ihrer App verknüpfen kann.
- Öffnen Sie die Datei mit dem Namen
local.properties
im Stammverzeichnis Ihres Projekts. Das ist die Ebene, in der sichgradle.properties
undsettings.gradle
befinden. - Definieren Sie einen neuen Schlüssel
GOOGLE_MAPS_API_KEY
und setzen Sie seinen Wert auf den von Ihnen erstellten API-Schlüssel.
lokale Properties.
GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE
Beachten Sie, dass local.properties
in der Datei .gitignore
im Git-Repository aufgeführt ist. Das liegt daran, dass Ihr API-Schlüssel als vertrauliche Informationen gilt und nach Möglichkeit nicht in der Versionskontrolle eingecheckt werden sollte.
- Um deinen API-Schlüssel verfügbar zu machen, damit er in deiner App verwendet werden kann, füge das Secrets Gradle Plugin for Android-Plug-in in deiner App
build.gradle
-Datei im Verzeichnisapp/
ein und füge die folgende Zeile implugins
-Block ein:
build.gradle-Datei auf App-Ebene
plugins {
// ...
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
- Ändern Sie die Datei
build.gradle
auf Projektebene so, dass sie den folgenden Kurspfad enthält:
build.gradle-Datei auf Projektebene
buildscript {
dependencies {
// ...
classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
}
}
Mit diesem Plug-in sind Schlüssel, die Sie in der Datei local.properties
definiert haben, als Build-Variablen in der Android-Manifestdatei und als Variablen in der von Gradle generierten Klasse BuildConfig
verfügbar. Mit diesem Plug-in wird der Boilerplate-Code entfernt, der ansonsten zum Lesen von Properties aus local.properties
erforderlich ist, damit der Zugriff auf Ihre gesamte App möglich ist.
Places SDK for Android-Abhängigkeit hinzufügen
- Da Sie jetzt in der App auf Ihren API-Schlüssel zugreifen können, fügen Sie der Datei
build.gradle
Ihrer App die Places SDK for Android-Abhängigkeit hinzu.
Diese Abhängigkeit wurde im Starter-Projekt, das mit diesem Codelab geliefert wird, bereits hinzugefügt.
build.gradle-Datei auf App-Ebene
dependencies {
// Dependency to include Places SDK for Android
implementation 'com.google.android.libraries.places:places:2.6.0'
}
- Führen Sie die App aus.
Jetzt sollte eine App mit einem leeren Bildschirm angezeigt werden. Nun werden auf diesem Bildschirm drei Demos angezeigt.
5. Places KTX installieren
Mit Kotlin-Bibliotheken (KTX) können Sie die Kotlin-Sprachfunktionen wie Koroutinen, Erweiterungseigenschaften und -funktionen nutzen, bei denen ein oder mehrere Google Maps Platform Android SDKs verwendet werden. Für jedes Google Maps SDK ist die entsprechende KTX-Bibliothek zu sehen:
Verwenden Sie in dieser Aufgabe die Places KTX-Bibliothek, um Kotlin-spezifische Sprachfunktionen in Ihrer App zu nutzen.
Places KTX-Abhängigkeit hinzufügen
Füge die entsprechende KTX-Bibliothek für dieses SDK in die Datei build.gradle
auf App-Ebene ein, um Kotlin-spezifische Funktionen zu nutzen.
build.gradle
dependencies {
// ...
// Places SDK for Android KTX Library
implementation 'com.google.maps.android:places-ktx:2.0.0'
}
6. Places-Client initialisieren
Places SDK für den Anwendungsbereich initialisieren
Initialisiere in der Datei DemoApplication.kt
des Ordners app/src/main/java/com/google/codelabs/maps/placesdemo
das Places SDK for Android. Fügen Sie die folgenden Zeilen am Ende der Funktion onCreate
ein:
// Initialize the SDK with the Google Maps Platform API key
Places.initialize(this, BuildConfig.GOOGLE_MAPS_API_KEY)
Wenn Sie Ihre App erstellen, wird der API-Schlüssel in der Datei local.properties
von Secrets Gradle Plugin for Android als BuildConfig.GOOGLE_MAPS_API_KEY
verfügbar gemacht.
Anwendungsdatei zum Manifest hinzufügen
Da du Application
mit DemoApplication
erweitert hast, musst du das Manifest aktualisieren. Füge die Property android:name
dem Element application
in der Datei AndroidManifest.xml
in app/src/main
hinzu:
<application
android:name=".DemoApplication"
...
</application>
Dieser Code verweist das Anwendungsmanifest auf die Klasse DemoApplication
im Ordner src/main/java/com/google/codelabs/maps/placesdemo/
.
7. Ortsdetails abrufen
Bildschirm „Details erstellen“
Ein activity_details.xml
-Layout mit einem leeren LinearLayout
ist im Ordner app/src/main/res/layout/
verfügbar. Fügen Sie beim linearen Layout den folgenden Code zwischen den <LinearLayout>
-Klappen ein.
<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" />
Mit diesem Code wird ein Texteingabefeld hinzugefügt, in dem der Nutzer eine beliebige Orts-ID eingeben oder die vorgegebene Standardeinstellung verwenden kann. Darüber hinaus werden eine Schaltfläche zum Starten der Place Details-Anfrage und eine TextView zum Anzeigen der Informationen aus der Antwort angezeigt. Verknüpfte Strings sind in der Datei src/main/res/values/strings.xml
für Sie definiert.
Detailaktivität erstellen
- Erstellen Sie im Ordner
src/main/java/com/google/codelabs/maps/placesdemo/
eineDetailsActivity.kt
-Datei und verknüpfen Sie sie mit dem soeben erstellten Layout. Füge diesen Code in die Datei ein:
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)
}
}
- Erstelle einen Places-Client zur Verwendung mit dieser Aktivität. Fügen Sie diesen Code ein, nachdem Sie das Objekt „view“ in der
onCreate
-Funktion eingerichtet haben.
// Retrieve a PlacesClient (previously initialized - see DemoApplication)
placesClient = Places.createClient(this)
- Nachdem Sie den Places-Client eingerichtet haben, hängen Sie einen Klick-Listener an die Schaltfläche an. Fügen Sie diesen Code nach dem Erstellen des Places-Clients in die Funktion
onCreate
ein.
// 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
}
}
}
Mit diesem Code wird die Orts-ID abgerufen, die in das Eingabefeld eingegeben wurde, und bestimmt, welche Felder für den Ort angefordert werden. Es wird ein FetchPlaceRequest
erstellt, die Aufgabe initiiert und ein Erfolgs- oder Fehlerwarten ausgeführt. Wenn die Anfrage erfolgreich ist, füllt die Funktion die TextView mit den angeforderten Details aus.
- Konvertieren Sie die
FetchPlaceResponse
in Text, indem Sie eine Erweiterungsfunktion definieren. EineStringUtil.kt
-Datei wird bereitgestellt, um die Konvertierung von Places SDK-Antworten in für Menschen lesbare Strings zu vereinfachen.
Definieren Sie am Ende der Datei DetailsActivity.kt
eine Funktion, um das Antwortobjekt „Fetch Place“ in einen String umzuwandeln.
fun FetchPlaceResponse.prettyPrint(): String {
return StringUtil.stringify(this, false)
}
Aktivität „Details“ in das Manifest einfügen
Fügen Sie ein <activity>
-Element für das DetailsActivity
-Element dem Element <application>
in der Datei AndroidManifest.xml
in app/src/main
hinzu:
<activity android:name=".DetailsActivity" />
Dem Detailmenü die Aktivität „Details“ hinzufügen
Ein leeres Demo
-Modul wird bereitgestellt, um die verfügbaren Demos auf dem Startbildschirm aufzulisten. Nachdem Sie eine Place Details-Aktivität erstellt haben, fügen Sie sie der Datei Demo.kt
im Ordner src/main/java/com/google/codelabs/maps/placesdemo/
mit folgendem Code hinzu:
DETAILS_FRAGMENT_DEMO(
R.string.details_demo_title,
R.string.details_demo_description,
DetailsActivity::class.java
),
Verknüpfte Strings sind in der Datei src/main/res/values/strings.xml
definiert.
Prüfen Sie MainActivity.kt
und stellen Sie fest, dass eine ListView erstellt wird, die durch den Inhalt des Demo
-Moduls iteriert wird. Wenn der Nutzer auf ein Element in der Liste tippt, wird die zugehörige Aktivität im Klick-Listener geöffnet.
Anwendung ausführen
- Führen Sie die App aus. Dieses Mal sollte ein Element in der Liste mit der Place Details-Demo angezeigt werden.
- Tippen Sie auf den Text der Ortsdetails. Sie sollten nun die von Ihnen erstellte Ansicht mit einem Eingabefeld und einer Schaltfläche sehen.
- Tippen Sie auf die Schaltfläche DETAILS ANSEHEN. Wenn Sie die Standard-Orts-ID verwendet haben, sollten Sie den Ortsnamen, die Adresse und die Kartenkoordinaten sehen, wie in Abbildung 1 dargestellt.
Abbildung 1. Ortsdetails-Aktivität mit angezeigter Antwort.
8. „Place Autocomplete“ verwenden
Autocomplete-Bildschirm erstellen
Im Ordner app/src/main/res/layout/
wird ein activity_autocomplete.xml
-Layout mit leerem LinearLayout
angezeigt. Fügen Sie diesen Code zwischen den Klammern <LinearLayout>
ein, um das lineare Layout zu füllen.
<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" />
Mit diesem Code werden ein AutocompleteSupportFragment
-Widget und eine TextView hinzugefügt, um die Informationen aus der Antwort anzuzeigen. Verknüpfte Strings sind in der Datei src/main/res/values/strings.xml
definiert.
Autocomplete-Aktivität erstellen
- Erstellen Sie eine
AutocompleteActivity.kt
-Datei im Ordnersrc/main/java/com/google/codelabs/maps/placesdemo/
und definieren Sie sie mit diesem Code:
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
}
}
Dieser Code verknüpft die Aktivität mit den in der Layoutdatei definierten Ansichten und AutocompleteSupportFramgent
.
- Definieren Sie als Nächstes, was passiert, wenn der Nutzer eine der von Place Autocomplete angezeigten Vervollständigungen auswählt. Füge diesen Code am Ende der Funktion
onCreate
hinzu:
// 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()
}
}
Dieser Code definiert, welche Felder für den Ort angefordert werden, ob ein Ortsauswahl-Ereignis erfasst wird und ob Erfolg oder Fehler überwacht wird. Wenn die Anfrage erfolgreich ist, füllt die Funktion die TextView mit den Ortsdetails aus. Place Autocomplete gibt ein Place-Objekt zurück. Sie müssen keine separate Place Details-Anfrage senden, wenn Sie das Place Autocomplete-Widget verwenden.
Autocomplete-Aktivität dem Manifest hinzufügen
Fügen Sie ein <activity>
-Element für das AutocompleteActivity
-Element dem Element <application>
in der Datei AndroidManifest.xml
in app/src/main
hinzu:
<activity android:name=".AutocompleteActivity" />
Autocomplete-Aktivitäten im Demomenü hinzufügen
Fügen Sie die Place Autocomplete-Demo wie gewohnt dem Startbildschirm hinzu. Fügen Sie sie dazu der Liste im Demo
-Modul hinzu. Nachdem Sie eine Place Autocomplete-Aktivität erstellt haben, fügen Sie sie der Datei Demo.kt
im Ordner src/main/java/com/google/codelabs/maps/placesdemo/
hinzu. Fügen Sie diesen Code direkt nach dem DETAILS_FRAGMENT_DEMO
-Element ein:
AUTOCOMPLETE_FRAGMENT_DEMO(
R.string.autocomplete_fragment_demo_title,
R.string.autocomplete_fragment_demo_description,
AutocompleteActivity::class.java
),
Verknüpfte Strings sind in der Datei src/main/res/values/strings.xml
definiert.
Anwendung ausführen
- Führen Sie die App aus. Diesmal sollten Sie zwei Elemente in der Liste auf dem Startbildschirm sehen.
- Tippen Sie auf die Zeile für die automatische Vervollständigung von Orten. Ein Pop-up-Fenster für die automatische Vervollständigung von Orten sollte angezeigt werden (Abbildung 2).
- Beginnen Sie mit der Eingabe eines Ortsnamens. Dies kann der Name einer Einrichtung, eine Adresse oder eine geografische Region sein. Vervollständigungen sollten während der Eingabe angezeigt werden.
- Wählen Sie eine der Vorhersagen aus. Die Prognosen sollten verschwinden und TextText sollte jetzt die Details zum ausgewählten Ort zeigen, wie in Abbildung 3 gezeigt.
Abbildung 2. Aktivitäten automatisch vervollständigen, nachdem der Nutzer auf das Eingabefeld tippt
Abbildung 3. Die Aktivitäten zur automatischen Vervollständigung mit Ortsdetails nach der Eingabe und Auswahl von Niagarafällen
9. Aktuellen Ort des Geräts abrufen
Bildschirm für den aktuellen Ort erstellen
Im Ordner app/src/main/res/layout/
wurde ein activity_current.xml
-Layout mit leerem LinearLayout
angegeben. Fügen Sie beim linearen Layout den folgenden Code zwischen den Klammern <LinearLayout>
ein.
<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" />
Aktivität für aktuelle Orte erstellen
- Erstellen Sie eine
CurrentActivity.kt
-Datei im Ordnersrc/main/java/com/google/codelabs/maps/placesdemo/
und definieren Sie sie mit diesem Code:
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()
}
}
}
Mit diesem Code wird die Aktivität den in der Layoutdatei definierten Ansichten zugeordnet. Außerdem wird ein Klick-Listener zur Schaltfläche hinzugefügt, um die Funktion checkPermissionThenFindCurrentPlace
aufzurufen, wenn auf die Schaltfläche geklickt wird.
- Definieren Sie
checkPermissionThenFindCurrentPlace()
, um die Berechtigung zur Standortermittlung zu prüfen und die Berechtigung anzufordern, falls sie noch nicht erteilt wurde. Fügen Sie diesen Code nach deronCreate
-Funktion ein.
/**
* 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
}
- Wenn der Zweig
else
der FunktioncheckPermissionThenFindCurrentPlace
requestPermissions
aufruft, wird in der App ein Dialogfeld für die Berechtigungsanfrage angezeigt. Wenn auf dem Gerät ein Betriebssystem mit einem älteren Betriebssystem als Android 12 verwendet wird, kann der Nutzer nur eine präzise (genaue) Berechtigung zur Standortermittlung erteilen. Wenn der Nutzer ein Gerät mit Android 12 oder höher verwendet, kann er den ungefähren Standort anstelle eines genauen (feinen) Standorts angeben, wie in Abbildung 4 gezeigt.
Abbildung 4. Wenn Sie auf einem Gerät mit Android 12 oder höher die Nutzerberechtigung anfordern, haben Sie die Möglichkeit, einen genauen oder ungefähren Standort zu bestimmen.
Nachdem der Nutzer auf das Dialogfeld mit den Systemberechtigungen geantwortet hat, ruft das System die Implementierung von onRequestPermissionsResult
in deiner App auf. Das System gibt die Nutzerantwort an den Berechtigungsdialog sowie den von Ihnen definierten Anfragecode weiter. Überschreibe onRequestPermissionResult
, um den Anfragecode für die Standortberechtigungen zu verarbeiten, die sich auf diese Aktivität für aktuelle Orte beziehen. Füge dazu den folgenden Code unter checkPermissionThenFindCurrentPlace
ein.
@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()
}
- Nachdem Sie die Berechtigung erteilt haben, wird die Funktion „
findCurrentPlace
“ ausgeführt. Definieren Sie die Funktion mit diesem Code nach der FunktiononRequestPermissionsResult
.
/**
* 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()
}
}
Dieser Code definiert, welche Felder für die wahrscheinlichen Orte angefordert werden, erstellt ein FindCurrentPlaceRequest
, initiiert die Aufgabe und füllt die TextView mit den angeforderten Details aus.
- Konvertieren Sie die
FindCurrentPlaceResponse
in Text, indem Sie eine Erweiterungsfunktion definieren. EineStringUtil.kt
-Datei wird bereitgestellt, um die Konvertierung von Places SDK-Antworten in für Menschen lesbare Strings zu vereinfachen.
Definieren Sie am Ende der Datei CurrentPlaceActivity.kt
eine Funktion, um das Antwortobjekt „Current Place“ zu konvertieren.
fun FindCurrentPlaceResponse.prettyPrint(): String {
return StringUtil.stringify(this, false)
}
Aktivität „Aktueller Ort“ in das Manifest einfügen
Fügen Sie ein <activity>
-Element für das CurrentPlaceActivity
-Element dem Element <application>
in der Datei AndroidManifest.xml
in app/src/main
hinzu:
<activity android:name=".CurrentPlaceActivity" />
Aktivität „Aktuelle Orte“ im Demomenü hinzufügen
Füge wie gewohnt die Demo „Aktueller Ort“ dem Startbildschirm hinzu, indem du sie der Liste im Modul Demo
hinzufügst. Nachdem Sie eine Aktivität „Aktueller Ort“ erstellt haben, fügen Sie sie der Datei Demo.kt
im Ordner src/main/java/com/google/codelabs/maps/placesdemo/
hinzu. Fügen Sie diesen Code direkt nach dem AUTOCOMPLETE_FRAGMENT_DEMO
-Element ein:
CURRENT_FRAGMENT_DEMO(
R.string.current_demo_title,
R.string.current_demo_description,
CurrentPlaceActivity::class.java
),
Verknüpfte Strings sind in der Datei src/main/res/values/strings.xml
definiert.
Anwendung ausführen
- Führen Sie die App aus. Diesmal sollten Sie drei Elemente in der Liste auf dem Startbildschirm sehen.
- Tippen Sie auf die Zeile „Aktueller Ort“. Du solltest eine Schaltfläche auf dem Bildschirm sehen.
- Tippe auf die Schaltfläche. Wenn Sie der App diese Berechtigung noch nicht erteilt haben, sollte eine Berechtigungsanfrage angezeigt werden.
- Erlaube der App, auf den Standort des Geräts zuzugreifen.
- Tippe noch einmal auf die Schaltfläche. Dieses Mal werden eine Liste mit bis zu 20 Orten in der Nähe und ihren Wahrscheinlichkeiten angezeigt, wie in Abbildung 5 dargestellt.
Abbildung 5. Potenzielle aktuelle Orte für den ermittelten Standort des Geräts werden angezeigt.
10. Glückwunsch
Sie haben mit dem Places SDK for Android eine Android-App erstellt.
Das haben Sie gelernt
- Places SDK for Android installieren und konfigurieren
- Kotlin-Erweiterungen für das Places SDK for Android installieren
- Ortsdetails werden geladen.
- Place Autocomplete verwenden
- Aktueller Ort wird abgerufen.
Nächste Schritte
- Sehen Sie sich das GitHub-Repository von
android-places-demos
an und holen Sie sich Beispiele dafür. - Hier finden Sie weitere Kotlin-Codelabs. zum Erstellen von Android-Apps mit der Google Maps Platform.
- Hilf uns, die Inhalte zu erstellen, die für dich am nützlichsten wären. Beantworten Sie dazu die folgende Frage:
Welche weiteren Codelabs möchten Sie sehen?
Ist das Codelab nicht verfügbar? Hier können Sie ein neues Problem beantragen.