Erste Schritte mit dem Places SDK for Android (Kotlin)

Erste Schritte mit dem Places SDK for Android (Kotlin)

Informationen zu diesem Codelab

subjectZuletzt aktualisiert: Juni 22, 2022
account_circleVerfasst von Angela Yu

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.

Places-Demo-App

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:

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.

  1. 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.

  1. 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.
  2. 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.

  1. 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.

  1. 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.

  1. Öffnen Sie die Datei mit dem Namen local.properties im Stammverzeichnis Ihres Projekts. Das ist die Ebene, in der sich gradle.properties und settings.gradle befinden.
  2. 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.

  1. 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 Verzeichnis app/ ein und füge die folgende Zeile im plugins-Block ein:

build.gradle-Datei auf App-Ebene

plugins {
   
// ...
    id
'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. Ä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

  1. 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'
}
  1. 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:

Diagramm zur Google Maps Platform-KTX

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

  1. Erstellen Sie im Ordner src/main/java/com/google/codelabs/maps/placesdemo/ eine DetailsActivity.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)

   
}
}
  1. 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)
  1. 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.

  1. Konvertieren Sie die FetchPlaceResponse in Text, indem Sie eine Erweiterungsfunktion definieren. Eine StringUtil.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

  1. Führen Sie die App aus. Dieses Mal sollte ein Element in der Liste mit der Place Details-Demo angezeigt werden.
  2. Tippen Sie auf den Text der Ortsdetails. Sie sollten nun die von Ihnen erstellte Ansicht mit einem Eingabefeld und einer Schaltfläche sehen.
  3. 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.

Ortsdetails-Aktivität mit Antwort

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

  1. Erstellen Sie eine AutocompleteActivity.kt-Datei im Ordner src/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.

  1. 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

  1. Führen Sie die App aus. Diesmal sollten Sie zwei Elemente in der Liste auf dem Startbildschirm sehen.
  2. 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).
  3. 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.
  4. 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.

Aktivitäten automatisch vervollständigen, nachdem der Nutzer auf das Eingabefeld tippt

Abbildung 2. Aktivitäten automatisch vervollständigen, nachdem der Nutzer auf das Eingabefeld tippt

Autocomplete-Aktivitäten, nachdem der Nutzer eingegeben und ausgewählt hat;Nigara Falls&rdquo

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

  1. Erstellen Sie eine CurrentActivity.kt-Datei im Ordner src/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.

  1. 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 der onCreate-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
   
}
  1. Wenn der Zweig else der Funktion checkPermissionThenFindCurrentPlace 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.

Nutzerberechtigung auf einem Gerät mit Android 12 oder höher anfordern

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
()
   
}
  1. Nachdem Sie die Berechtigung erteilt haben, wird die Funktion „findCurrentPlace“ ausgeführt. Definieren Sie die Funktion mit diesem Code nach der Funktion 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
()

       
}
   
}

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.

  1. Konvertieren Sie die FindCurrentPlaceResponse in Text, indem Sie eine Erweiterungsfunktion definieren. Eine StringUtil.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

  1. Führen Sie die App aus. Diesmal sollten Sie drei Elemente in der Liste auf dem Startbildschirm sehen.
  2. Tippen Sie auf die Zeile „Aktueller Ort“. Du solltest eine Schaltfläche auf dem Bildschirm sehen.
  3. Tippe auf die Schaltfläche. Wenn Sie der App diese Berechtigung noch nicht erteilt haben, sollte eine Berechtigungsanfrage angezeigt werden.
  4. Erlaube der App, auf den Standort des Geräts zuzugreifen.
  5. 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.

Potenzielle aktuelle Orte für den ermittelten Standort werden angezeigt

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

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.