Premiers pas avec le SDK Places pour Android (Kotlin)

1. Avant de commencer

Cet atelier de programmation vous explique comment intégrer le SDK Places pour Android à votre application et en utiliser chacune des fonctionnalités.

Application de démonstration Places

Conditions préalables

  • Connaissances de base en développement avec Kotlin et Android

Points abordés

  • Installer le SDK Places pour Android avec des extensions Kotlin
  • Charger Places Details pour un lieu spécifique
  • Ajouter un widget Place Autocomplete à l'application
  • Charger l'emplacement actuel en fonction de la position indiquée par l'appareil

Prérequis

Pour suivre cet atelier de programmation, vous aurez besoin des comptes, des services et des outils suivants :

2. Configuration

Pour réaliser l'étape ci-dessous, activez l'API Places.

Configurer Google Maps Platform

Si vous ne disposez pas encore d'un compte Google Cloud Platform et d'un projet pour lequel la facturation est activée, consultez le guide Premiers pas avec Google Maps Platform pour savoir comment créer un compte de facturation et un projet.

  1. Dans Cloud Console, cliquez sur le menu déroulant des projets, puis sélectionnez celui que vous souhaitez utiliser pour cet atelier de programmation.

  1. Activez les API et les SDK Google Maps Platform requis pour cet atelier de programmation dans Google Cloud Marketplace. Pour ce faire, suivez les étapes indiquées dans cette vidéo ou dans cette documentation.
  2. Générez une clé API sur la page Identifiants de Cloud Console. Vous pouvez suivre la procédure décrite dans cette vidéo ou dans cette documentation. Toutes les requêtes envoyées à Google Maps Platform nécessitent une clé API.

3. Démarrage rapide

Voici un code de démarrage qui vous permettra de commencer rapidement cet atelier de programmation. Vous pouvez tout à fait passer directement au résultat, mais si vous souhaitez voir toutes les étapes et les réaliser de votre côté, poursuivez votre lecture.

  1. Clonez le dépôt si vous avez installé git.
git clone https://github.com/googlemaps/codelab-places-101-android.git

Vous pouvez également cliquer sur le bouton ci-dessous pour télécharger le code source.

  1. Après avoir téléchargé le code, ouvrez le projet qui se trouve dans le répertoire /starter dans Android Studio. Ce projet inclut la structure de fichier de base dont vous avez besoin pour l'atelier de programmation. Tous les éléments avec lesquels vous devez travailler se trouvent dans le répertoire /starter.

Si vous souhaitez exécuter le code complet de la solution, vous pouvez consulter le code terminé dans le répertoire /solution.

4. Installer le SDK Places pour Android

Dans cette section, vous allez ajouter le SDK Places pour Android aux dépendances de votre application.

Ajouter votre clé API

Fournissez la clé API créée précédemment à l'application afin que le SDK Places pour Android puisse la lui associer.

  1. Ouvrez le fichier nommé local.properties dans le répertoire racine de votre projet (au même niveau que gradle.properties et settings.gradle).
  2. Paramétrez une nouvelle clé GOOGLE_MAPS_API_KEY en définissant sa valeur sur la clé API créée.

local.properties

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

Notez que local.properties est répertorié dans le fichier .gitignore du dépôt Git. En effet, votre clé API est considérée comme une information sensible et ne doit pas être vérifiée dans un contrôle du code source, si possible.

  1. Pour exposer ensuite votre clé API afin de l'utiliser dans l'ensemble de votre application, incluez le plug-in Secrets Gradle pour Android dans le fichier build.gradle de votre application (situé dans le répertoire app/) et ajoutez la ligne suivante dans le bloc plugins :

build.gradle au niveau de l'application

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. Modifiez votre fichier build.gradle au niveau du projet pour inclure le chemin de classe suivant :

build.gradle au niveau du projet

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

Avec ce plug-in, les clés que vous avez définies dans votre fichier local.properties sont disponibles en tant que variantes de compilation dans le fichier manifeste Android et en tant que variables dans la classe BuildConfig générée par Gradle au moment de la compilation. Ainsi, vous n'avez plus besoin du code récurrent permettant de lire les propriétés de local.properties afin d'étendre l'accès à l'ensemble de l'application.

Ajouter la dépendance du SDK Places pour Android

  1. Maintenant que l'application a accès à votre clé API, ajoutez la dépendance du SDK Maps pour Android dans le fichier build.gradle de votre application.

Dans le projet initial proposé dans cet atelier de programmation, cette dépendance a déjà été ajoutée.

build.gradle au niveau de l'application

dependencies {
   // Dependency to include Places SDK for Android
   implementation 'com.google.android.libraries.places:places:2.6.0'
}
  1. Exécutez l'application.

Vous devriez maintenant voir une application avec un écran vide. Renseignez trois démos dans cet écran.

5. Installer Places Android KTX

Pour les applications Kotlin qui utilisent un ou plusieurs SDK Google Maps Platform Android, les bibliothèques d'extensions Kotlin (KTX) vous permettent de bénéficier des fonctionnalités du langage Kotlin, comme les coroutines, les propriétés et fonctions d'extension, etc. Chaque SDK Google Maps possède une bibliothèque KTX correspondante, comme indiqué ci-dessous :

Diagramme KTX de Google Maps Platform

Dans cette tâche, vous allez utiliser la bibliothèque Places Android KTX pour utiliser les fonctionnalités de langage spécifiques à Kotlin dans votre application.

Ajouter la dépendance Places Android KTX

Pour profiter des fonctionnalités spécifiques à Kotlin, incluez la bibliothèque KTX correspondante pour ce SDK à votre fichier build.gradle au niveau de l'application.

build.gradle

dependencies {
    // ...

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

6. Initialiser le client Places

Initialiser le SDK Places pour la portée de l'application

Dans le fichier DemoApplication.kt du dossier app/src/main/java/com/google/codelabs/maps/placesdemo, initialisez le SDK Places pour Android. Collez les lignes ci-dessous à la fin de la fonction onCreate :

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

Lorsque vous compilez l'application, le plug-in Secrets Gradle pour Android rend la clé API du fichier local.properties disponible en tant que BuildConfig.GOOGLE_MAPS_API_KEY.

Ajouter le fichier d'application au fichier manifeste

Étant donnée que vous avez étendu Application avec DemoApplication, vous devez modifier le fichier manifeste. Ajoutez la propriété android:name à l'élément application du fichier AndroidManifest.xml, situé dans app/src/main :

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

Ce code pointe le fichier manifeste de l'application vers la classe DemoApplication du dossier src/main/java/com/google/codelabs/maps/placesdemo/.

7. Extraire Place Details

Créer un écran "Détails"

Une mise en page activity_details.xml avec un LinearLayout vide est disponible dans le dossier app/src/main/res/layout/. Ajoutez à la mise en page linéaire le code suivant entre les crochets <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" />

Ce code ajoute un champ de saisie de texte dans lequel l'utilisateur peut saisir n'importe quel ID de lieu ou utiliser la valeur par défaut fournie, un bouton pour lancer la requête Places Details et un TextView pour afficher les informations de la réponse. Les chaînes associées sont définies pour vous dans le fichier src/main/res/values/strings.xml.

Créer une activité Details

  1. Créez un fichier DetailsActivity.kt dans le dossier src/main/java/com/google/codelabs/maps/placesdemo/ et associez-le à la mise en page que vous venez de créer. Collez le code suivant dans le fichier :
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. Créez un client Places à utiliser avec cette activité. Collez le code suivant après la configuration de l'objet de vue dans la fonction onCreate.
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. Une fois le client Places configuré, associez un écouteur de clics au bouton. Collez le code suivant après la création du client Places dans la fonction 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
                }
            }
        }

Ce code récupère l'ID de lieu renseigné dans le champ de saisie, définit les champs à demander pour le lieu, crée un FetchPlaceRequest, lance la tâche et l'écoute pour savoir si elle aboutit ou non. Si la requête aboutit, la fonction renseigne les informations demandées dans TextView.

  1. Convertissez FetchPlaceResponse en texte en définissant une fonction d'extension. Un fichier StringUtil.kt est fourni pour simplifier la conversion des réponses du SDK Places en chaînes lisibles.

À la fin du fichier DetailsActivity.kt, définissez une fonction pour convertir l'objet de réponse Fetch Place en chaîne.

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

Ajouter l'activité Détails au fichier manifeste

Ajoutez un élément <activity> pour DetailsActivity en tant qu'enfant de l'élément <application> dans le fichier AndroidManifest.xml, situé dans app/src/main :

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

Ajouter l'activité Détails dans le menu de démonstration

Un module Demo vide est fourni pour lister les versions de démonstration disponibles sur l'écran d'accueil. Maintenant que vous avez créé une activité Place Details, ajoutez-la au fichier Demo.kt du dossier src/main/java/com/google/codelabs/maps/placesdemo/ avec le code suivant :

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

Les chaînes associées sont définies dans le fichier src/main/res/values/strings.xml.

Inspectez MainActivity.kt : vous remarquerez qu'il crée une ListView qui est renseignée par itération des contenus du module Demo. Si l'utilisateur appuie sur un élément de la liste, l'écouteur de clics ouvre l'activité associée.

Exécuter l'application

  1. Exécutez l'application. Cette fois, un élément de la liste doit présenter la démonstration Place Details.
  2. Appuyez sur le texte Place Details. Vous devriez voir la vue créée ainsi qu'un champ de saisie et un bouton.
  3. Appuyez sur le bouton "OBTENIR DES INFORMATIONS". Si vous avez utilisé l'identifiant de lieu par défaut, vous devriez voir le nom du lieu, son adresse et ses coordonnées sur la carte, comme illustré dans la Figure 1.

Activité Place Details avec réponse

Figure 1. Activité Place Details avec réponse affichée.

8. Ajouter Place Autocomplete

Créer un écran de saisie semi-automatique

Une mise en page activity_autocomplete.xml avec un LinearLayout vide est fournie dans le dossier app/src/main/res/layout/. Ajoutez à la mise en page linéaire le code suivant entre les crochets <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" />

Ce code ajoute un widget AutocompleteSupportFragment et un TextView pour afficher les informations de la réponse. Les chaînes associées sont définies dans le fichier src/main/res/values/strings.xml.

Créer une activité de saisie semi-automatique

  1. Créez un fichier AutocompleteActivity.kt dans le dossier src/main/java/com/google/codelabs/maps/placesdemo/ et définissez-le à l'aide du code suivant :
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
    }
}

Ce code associe l'activité aux vues et à AutocompleteSupportFramgent, que vous avez défini dans le fichier de mise en page.

  1. Ensuite, définissez l'action à effectuer lorsque l'utilisateur sélectionne l'une des prédictions suggérées par Place Autocomplete. Ajoutez le code suivant à la fin de la fonction 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()
                }
            }

Ce code définit les champs à demander pour le lieu, et écoute pour détecter des événements de sélection de lieu ainsi que pour savoir s'ils aboutissent ou non. Si la requête aboutit, la fonction renseigne les informations sur le lieu dans TextView. Notez que Place Autocomplete renvoie un objet Place. Il n'est pas nécessaire d'envoyer une requête Places Details distincte lorsque vous utilisez le widget Place Autocomplete.

Ajouter l'activité de saisie semi-automatique au fichier manifeste

Ajoutez un élément <activity> pour AutocompleteActivity en tant qu'enfant de l'élément <application> dans le fichier AndroidManifest.xml, situé dans app/src/main :

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

Ajouter l'activité de saisie semi-automatique dans le menu de démonstration

Comme précédemment, ajoutez la démonstration de Place Autocomplete à l'écran d'accueil en l'ajoutant à la liste du module Demo. Maintenant que vous avez créé une activité Place Autocomplete, ajoutez-la au fichier Demo.kt du dossier src/main/java/com/google/codelabs/maps/placesdemo/. Collez le code suivant juste après l'élément DETAILS_FRAGMENT_DEMO :

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

Les chaînes associées sont définies dans le fichier src/main/res/values/strings.xml.

Exécuter l'application

  1. Exécutez l'application : deux éléments devraient s'afficher dans la liste de l'écran d'accueil.
  2. Appuyez sur la ligne Place Autocomplete. Vous devriez voir un pop-up de saisie Place Autocomplete comme illustré dans la Figure 2.
  3. Commencez à saisir le nom d'un lieu. Il peut s'agir du nom d'un établissement, d'une adresse ou d'une région. Les prédictions doivent s'afficher à mesure que vous saisissez du texte.
  4. Sélectionnez l'une des prédictions. Les prédictions devraient disparaître, et TextView devrait afficher les détails du lieu sélectionné, comme illustré dans la Figure 3.

Activité de saisie semi-automatique une fois que l'utilisateur appuie sur le champ de saisie

Figure 2. Activité de saisie semi-automatique une fois que l'utilisateur appuie sur le champ de saisie.

Activité de saisie semi-automatique une fois que l'utilisateur a saisi et sélectionné "Chutes du Niagara"

Figure 3. Activité de saisie semi-automatique une fois que l'utilisateur a saisi et sélectionné "Chutes du Niagara".

9. Obtenir l'emplacement actuel de l'appareil

Créer un écran "Emplacement actuel"

Une mise en page activity_current.xml avec un LinearLayout vide est fournie dans le dossier app/src/main/res/layout/. Ajoutez à la mise en page linéaire le code suivant entre les crochets <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" />

Créer une activité d'emplacement actuel

  1. Créez un fichier CurrentActivity.kt dans le dossier src/main/java/com/google/codelabs/maps/placesdemo/ et définissez-le à l'aide du code suivant :
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()
        }
    }
}

Ce code associe l'activité aux vues que vous avez définies dans le fichier de mise en page. Un écouteur de clics est également ajouté au bouton pour appeler la fonction checkPermissionThenFindCurrentPlace lorsque l'utilisateur clique dessus.

  1. Définissez l'élément checkPermissionThenFindCurrentPlace() pour vérifier l'autorisation d'accéder à la position précise et la demander si elle n'a pas encore été accordée. Collez le code suivant après la fonction 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. Lorsque la branche else de la fonction checkPermissionThenFindCurrentPlace appelle requestPermissions, l'application affiche une boîte de dialogue pour demander l'autorisation à l'utilisateur. S'il exécute un appareil avec un système d'exploitation antérieur à Android 12, il peut uniquement accorder une autorisation de géolocalisation précise. Si l'utilisateur utilise un appareil exécutant Android 12 ou version ultérieure, il aura la possibilité d'indiquer sa position approximative plutôt que sa position précise, comme illustré dans la Figure 4.

Demande d'autorisation de l'utilisateur sur un appareil exécutant Android 12 ou version ultérieure

Figure 4. Demander l'autorisation de l'utilisateur sur un appareil exécutant Android 12 ou version ultérieure permet d'en obtenir la position précise ou approximative.

Une fois que l'utilisateur a répondu à la boîte de dialogue d'autorisations du système, celui-ci appelle l'intégration de onRequestPermissionsResult dans votre application. Le système transmet la réponse de l'utilisateur à la boîte de dialogue d'autorisation, ainsi que le code de demande que vous avez défini. Ignorez onRequestPermissionResult pour gérer le code de demande d'autorisation d'accéder à la position associées à cette activité de l'emplacement actuel en collant le code suivant sous 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. Une fois cette autorisation accordée, la fonction findCurrentPlace s'exécute. Définissez la fonction avec le code suivant après la fonction 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()

        }
    }

Ce code définit les champs à demander pour les lieux probables, crée un FindCurrentPlaceRequest, lance la tâche et renseigne le TextView avec les informations requises.

  1. Convertissez FindCurrentPlaceResponse en texte en définissant une fonction d'extension. Un fichier StringUtil.kt est fourni pour simplifier la conversion des réponses du SDK Places en chaînes lisibles.

À la fin du fichier CurrentPlaceActivity.kt, définissez une fonction pour convertir l'objet de réponse Current Place en chaîne.

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

Ajouter l'activité de l'emplacement actuel au fichier manifeste

Ajoutez un élément <activity> pour CurrentPlaceActivity en tant qu'enfant de l'élément <application> dans le fichier AndroidManifest.xml, situé dans app/src/main :

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

Ajouter l'activité de l'emplacement actuel au menu de démonstration

Comme précédemment, ajoutez la démonstration de Current Place à l'écran d'accueil en l'ajoutant à la liste du module Demo. Maintenant que vous avez créé une activité de l'emplacement actuel, ajoutez-la au fichier Demo.kt dans le dossier src/main/java/com/google/codelabs/maps/placesdemo/. Collez le code suivant juste après l'élément AUTOCOMPLETE_FRAGMENT_DEMO :

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

Les chaînes associées sont définies dans le fichier src/main/res/values/strings.xml.

Exécuter l'application

  1. Exécutez l'application : trois éléments devraient s'afficher dans la liste de l'écran d'accueil.
  2. Appuyez sur la ligne "Emplacement actuel". Un bouton devrait apparaître à l'écran.
  3. Appuyez sur le bouton. Si vous n'avez pas encore autorisé l'application à accéder à votre position, une demande d'autorisation devrait s'afficher.
  4. Autorisez l'application à accéder à la position de l'appareil.
  5. Appuyez à nouveau sur le bouton. Cette fois, une liste contenant jusqu'à 20 lieux à proximité et leurs probabilités devrait s'afficher, comme illustré dans la Figure 5.

Présentation des correspondances probables de l'emplacement actuel pour la position indiquée par l'appareil

Figure 5. Présentation des correspondances probables de l'emplacement actuel pour la position indiquée par l'appareil.

10. Félicitations

Vous avez créé une application Android à l'aide du SDK Places pour Android.

Ce que vous avez appris

Étapes suivantes

  • Explorez ou dupliquez le dépôt d'échantillons et de démonstrations android-places-demos pour trouver l'inspiration.
  • Découvrez d'autres ateliers de programmation Kotlin pour créer des applications Android avec Google Maps Platform.
  • Aidez-nous à créer le contenu qui vous semble le plus utile en répondant à la question suivante :

Quels autres ateliers de programmation souhaiteriez-vous voir ?

Visualisation des données sur les cartes En savoir plus sur la personnalisation du style de mes cartes Concevoir des interactions 3D dans Google Maps

L'atelier de programmation que vous souhaitez suivre ne figure pas dans la liste ? Demandez-le en décrivant un nouveau problème ici.