Memulai Places SDK for Android (Kotlin)

1. Sebelum Memulai

Codelab ini mengajarkan cara mengintegrasikan Places SDK for Android dengan aplikasi Anda dan menggunakan setiap fitur Places SDK.

Aplikasi demo Places

Prasyarat

  • Pengetahuan dasar tentang pengembangan Kotlin dan Android

Yang akan Anda pelajari

  • Cara menginstal Places SDK for Android dengan Ekstensi Kotlin.
  • Cara memuat Place Details untuk tempat tertentu.
  • Cara menambahkan widget Place Autocomplete ke aplikasi Anda.
  • Cara memuat Current Place berdasarkan lokasi yang dilaporkan saat ini di perangkat.

Yang akan Anda perlukan

Untuk menyelesaikan codelab ini, Anda memerlukan akun, layanan, dan alat berikut:

2. Memulai penyiapan

Untuk langkah pengaktifan di bawah, aktifkan Places API.

Menyiapkan Google Maps Platform

Jika Anda belum memiliki akun Google Cloud Platform dan project dengan penagihan diaktifkan, lihat panduan Memulai Google Maps Platform untuk membuat akun penagihan dan project.

  1. Di Cloud Console, klik menu drop-down project lalu pilih project yang ingin Anda gunakan untuk codelab ini.

  1. Aktifkan API dan SDK Google Maps Platform yang diperlukan untuk codelab ini di Google Cloud Marketplace. Untuk melakukannya, ikuti langkah-langkah dalam video ini atau dokumentasi ini.
  2. Buat kunci API di halaman Kredensial di Cloud Console. Anda dapat mengikuti langkah-langkah dalam video ini atau dokumentasi ini. Semua permintaan ke Google Maps Platform memerlukan kunci API.

3. Mulai cepat

Untuk membantu Anda memulai secepatnya, download kode awal untuk membantu Anda mengikuti codelab ini. Anda dapat langsung ke bagian solusi, namun jika Anda ingin mengikuti semua langkah untuk membuatnya sendiri, baca semuanya.

  1. Lakukan clone repositori jika sudah menginstal git.
git clone https://github.com/googlemaps/codelab-places-101-android.git

Atau, klik tombol ini untuk mendownload kode sumber.

  1. Setelah mendownload kode, buka project yang ada dalam direktori /starter di Android Studio. Project ini mencakup struktur file dasar yang Anda butuhkan untuk menyelesaikan codelab. Semua yang Anda butuhkan ada di direktori /starter.

Jika Anda ingin melihat kode solusi lengkap berjalan, Anda dapat melihat kode yang sudah selesai di direktori /solution.

4. Menginstal Places SDK for Android

Di bagian ini, Anda akan menambahkan Places SDK for Android ke dependensi aplikasi Anda.

Menambahkan kunci API

Berikan kunci API yang Anda buat sebelumnya ke aplikasi, sehingga Places SDK for Android dapat mengaitkan kunci dengan aplikasi Anda.

  1. Buka file bernama local.properties di direktori utama project Anda (tingkat yang sama tempat gradle.properties dan settings.gradle berada).
  2. Tentukan kunci baru GOOGLE_MAPS_API_KEY, dengan menetapkan nilainya ke kunci API yang Anda buat.

local.properties

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

Perhatikan bahwa local.properties dicantumkan dalam file .gitignore di repositori Git. Hal ini karena kunci API Anda dianggap sebagai informasi sensitif dan tidak boleh diupload ke kontrol sumber, jika memungkinkan.

  1. Selanjutnya, untuk mengekspos kunci API Anda agar dapat digunakan di seluruh aplikasi, sertakan plugin Plugin Secrets Gradle untuk Android dalam file build.gradle aplikasi Anda, yang terletak di direktori app/ dan tambahkan baris berikut dalam blok plugins:

build.gradle tingkat aplikasi

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. Ubah file build.gradle tingkat project Anda untuk menyertakan classpath berikut:

build.gradle tingkat project

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

Plugin ini akan membuat kunci yang telah Anda tentukan dalam file local.properties tersedia sebagai variabel build dalam file manifes Android, dan sebagai variabel dalam class BuildConfig yang dihasilkan Gradle pada waktu build. Menggunakan plugin ini akan menghapus kode boilerplate yang seharusnya diperlukan untuk membaca properti dari local.properties, sehingga dapat diakses di seluruh aplikasi Anda.

Menambahkan dependensi Places SDK for Android

  1. Setelah kunci API Anda dapat diakses dalam aplikasi, tambahkan dependensi Places SDK for Android ke file build.gradle aplikasi Anda.

Dalam project permulaan yang disertakan bersama codelab ini, dependensi ini telah ditambahkan untuk Anda.

build.gradle tingkat aplikasi

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

Anda sekarang akan melihat aplikasi dengan layar kosong. Lanjutkan untuk mengisi layar ini dengan tiga demo.

5. Menginstal Android KTX Places

Untuk aplikasi Kotlin yang menggunakan satu atau beberapa Android SDK untuk Google Maps Platform, library ekstensi Kotlin (KTX) memungkinkan Anda memanfaatkan fitur bahasa Kotlin, seperti coroutine, properti/fungsi ekstensi, dan lainnya. Setiap Google Maps SDK memiliki library KTX yang sesuai seperti yang ditunjukkan di bawah ini:

Diagram KTX Google Maps Platform

Dalam tugas ini, gunakan library Android KTX Places untuk menggunakan fitur bahasa khusus Kotlin di aplikasi Anda.

Menambahkan dependensi Android KTX Places

Untuk memanfaatkan fitur khusus Kotlin, sertakan library KTX yang sesuai untuk SDK ini dalam file build.gradle di tingkat aplikasi Anda.

build.gradle

dependencies {
    // ...

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

6. Melakukan inisialisasi Places Client

Melakukan inisialisasi Places SDK untuk cakupan aplikasi

Dalam file DemoApplication.kt di folder app/src/main/java/com/google/codelabs/maps/placesdemo, lakukan inisialisasi Places SDK for Android. Tempelkan baris di bawah di bagian akhir fungsi onCreate:

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

Saat Anda membuat aplikasi, Plugin Secrets Gradle untuk Android menyediakan kunci API di file local.properties sebagai BuildConfig.GOOGLE_MAPS_API_KEY.

Menambahkan file aplikasi ke manifes

Karena Anda telah memperluas Application dengan DemoApplication, Anda harus mengupdate manifes. Tambahkan properti android:name ke elemen application di file AndroidManifest.xml, yang terletak di app/src/main:

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

Poin kode ini mengarahkan manifes aplikasi ke class DemoApplication di folder src/main/java/com/google/codelabs/maps/placesdemo/.

7. Mengambil Place Details

Membuat layar Details

Tata letak activity_details.xml dengan LinearLayout kosong tersedia di folder app/src/main/res/layout/. Isi tata letak linier dengan menambahkan kode berikut di antara tanda kurung <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" />

Kode ini menambahkan kolom input teks tempat pengguna dapat memasukkan Place ID atau menggunakan default yang disediakan, tombol untuk memulai permintaan Place Details, dan TextView untuk menampilkan informasi dari respons. String terkait ditentukan untuk Anda dalam file src/main/res/values/strings.xml.

Membuat aktivitas Details

  1. Buat file DetailsActivity.kt di folder src/main/java/com/google/codelabs/maps/placesdemo/ dan kaitkan dengan tata letak yang baru saja Anda buat. Tempelkan kode ini ke dalam file:
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. Buat Places Client untuk digunakan bersama aktivitas ini. Tempelkan kode ini setelah objek tampilan disiapkan di fungsi onCreate.
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. Setelah Places Client disiapkan, lampirkan pemroses klik ke tombol. Tempelkan kode ini setelah pembuatan Places Client dalam fungsi 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
                }
            }
        }

Kode ini mengambil Place ID yang telah dimasukkan di kolom input, menentukan kolom untuk meminta tempat, membuat FetchPlaceRequest, memulai tugas, dan memproses keberhasilan atau kegagalan. Jika permintaan tersebut berhasil, fungsi akan mengisi TextView dengan detail yang diminta.

  1. Konversikan FetchPlaceResponse menjadi teks dengan menentukan fungsi ekstensi. File StringUtil.kt diberikan untuk menyederhanakan konversi respons Places SDK menjadi string yang dapat dibaca manusia.

Di akhir file DetailsActivity.kt, tentukan fungsi untuk mengonversi objek respons Fetch Place menjadi string.

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

Menambahkan aktivitas Details ke manifes

Tambahkan elemen <activity> untuk DetailsActivity sebagai turunan elemen <application> dalam file AndroidManifest.xml, yang terletak di app/src/main:

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

Menambahkan aktivitas Details ke menu demo

Modul Demo kosong disediakan untuk mencantumkan demo yang tersedia di layar utama. Setelah Anda membuat aktivitas Place Details, tambahkan ke file Demo.kt dalam folder src/main/java/com/google/codelabs/maps/placesdemo/ dengan kode ini:

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

String terkait ditentukan dalam file src/main/res/values/strings.xml.

Periksa MainActivity.kt dan amati bahwa aktivitas membuat ListView yang diisi dengan melakukan iterasi melalui konten modul Demo. Jika pengguna mengetuk item dalam daftar, pemroses klik akan membuka aktivitas terkait.

Menjalankan aplikasi

  1. Jalankan aplikasi. Kali ini Anda akan melihat satu item dalam daftar yang menampilkan demo Place Details.
  2. Ketuk teks Place Details. Anda akan melihat tampilan yang Anda buat dengan tombol dan kolom input.
  3. Ketuk tombol "GET DETAILS". Jika menggunakan Place ID default, Anda akan melihat nama tempat, alamat, dan koordinat peta ditampilkan, seperti yang ditampilkan dalam Gambar 1.

Aktivitas Place Details dengan respons

Gambar 1. Aktivitas Place Details dengan respons ditampilkan.

8. Menambahkan Place Autocomplete

Membuat layar Autocomplete

Tata letak activity_autocomplete.xml dengan LinearLayout kosong disediakan di folder app/src/main/res/layout/. Isi tata letak linear dengan menambahkan kode ini di antara tanda kurung <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" />

Kode ini menambahkan widget AutocompleteSupportFragment dan TextView untuk menampilkan informasi dari respons. String terkait ditentukan dalam file src/main/res/values/strings.xml.

Membuat aktivitas Autocomplete

  1. Buat file AutocompleteActivity.kt di folder src/main/java/com/google/codelabs/maps/placesdemo/ dan tentukan dengan kode ini:
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
    }
}

Kode ini mengaitkan aktivitas dengan tampilan dan AutocompleteSupportFramgent yang Anda tentukan di file tata letak.

  1. Selanjutnya, tentukan apa yang terjadi ketika pengguna memilih salah satu prediksi yang ditampilkan oleh Place Autocomplete. Tambahkan kode ini ke bagian akhir fungsi 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()
                }
            }

Kode ini menentukan kolom untuk meminta tempat, memproses peristiwa pemilihan tempat, dan memproses keberhasilan atau kegagalan. Jika permintaan tersebut berhasil, fungsi akan mengisi TextView dengan detail tempat. Perhatikan bahwa Place Autocomplete menampilkan objek Place; tidak perlu membuat permintaan Place Details terpisah saat menggunakan widget Place Autocomplete.

Menambahkan aktivitas Autocomplete ke manifes

Tambahkan elemen <activity> untuk AutocompleteActivity sebagai turunan elemen <application> dalam file AndroidManifest.xml, yang terletak di app/src/main:

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

Menambahkan aktivitas Autocomplete ke menu demo

Sama seperti sebelumnya, tambahkan demo Place Autocomplete ke layar utama dengan menambahkannya ke daftar dalam modul Demo. Setelah Anda membuat aktivitas Place Autocomplete, tambahkan aktivitas tersebut ke file Demo.kt di folder src/main/java/com/google/codelabs/maps/placesdemo/. Tempelkan langsung kode ini setelah item DETAILS_FRAGMENT_DEMO:

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

String terkait ditentukan dalam file src/main/res/values/strings.xml.

Menjalankan aplikasi

  1. Jalankan aplikasi. Kali ini Anda akan melihat dua item dalam daftar layar utama.
  2. Ketuk baris Place Autocomplete. Anda akan melihat pop-up input Place Autocomplete seperti yang ditampilkan dalam Gambar 2.
  3. Mulai ketik nama tempat. Ini dapat berupa nama bangunan, alamat, atau wilayah geografis. Prediksi akan ditampilkan saat Anda mengetik.
  4. Pilih salah satu prediksi. Prediksi akan hilang dan TextView kini akan menampilkan detail tentang tempat yang dipilih seperti yang ditampilkan dalam Gambar 3.

Aktivitas Autocomplete setelah pengguna mengetuk kolom input

Gambar 2. Aktivitas Autocomplete setelah pengguna mengetuk kolom input.

Aktivitas Autocomplete setelah pengguna mengetik dan memilih &ldquo;Niagara Falls&rdquo;

Gambar 3. Aktivitas Autocomplete yang menampilkan Place Details setelah pengguna mengetik dan memilih "Niagara Falls".

9. Mendapatkan Current Place dari perangkat

Membuat layar Current Place

Tata letak activity_current.xml dengan LinearLayout kosong telah disediakan di folder app/src/main/res/layout/. Isi tata letak linear dengan menambahkan kode berikut di antara tanda kurung <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" />

Membuat aktivitas Current Place

  1. Buat file CurrentActivity.kt di folder src/main/java/com/google/codelabs/maps/placesdemo/ dan tentukan dengan kode ini:
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()
        }
    }
}

Kode ini mengaitkan aktivitas dengan tampilan yang Anda tentukan di file tata letak. Kode ini juga menambahkan pemroses klik ke tombol untuk memanggil fungsi checkPermissionThenFindCurrentPlace saat tombol diklik.

  1. Tentukan checkPermissionThenFindCurrentPlace() untuk memeriksa izin akses lokasi detail dan meminta izin jika belum diberikan. Tempelkan kode ini setelah fungsi 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. Saat cabang else dari fungsi checkPermissionThenFindCurrentPlace memanggil requestPermissions, aplikasi akan menampilkan dialog permintaan izin kepada pengguna. Jika pengguna menjalankan perangkat yang menjalankan OS lebih rendah dari Android 12, pengguna hanya dapat memberikan izin akses lokasi akurat (mendetail). Jika pengguna menggunakan perangkat yang menjalankan Android 12 atau versi yang lebih tinggi, mereka akan memiliki opsi untuk memberikan perkiraan lokasi (kasar) dan bukan lokasi akurat (mendetail), seperti yang ditampilkan dalam Gambar 4.

Meminta izin pengguna di perangkat yang menjalankan Android 12 atau versi yang lebih tinggi

Gambar 4. Meminta izin pengguna di perangkat yang menjalankan Android 12 atau versi yang lebih tinggi akan menampilkan opsi untuk memberikan lokasi akurat atau perkiraan lokasi.

Setelah pengguna merespons dialog izin sistem, sistem akan memanggil implementasi onRequestPermissionsResult aplikasi Anda. Sistem meneruskan respons pengguna ke dialog izin, serta kode permintaan yang Anda tentukan. Ganti onRequestPermissionResult untuk menangani kode permintaan izin akses lokasi yang terkait dengan aktivitas Current Place dengan menempelkan kode berikut di bawah 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. Setelah izin diberikan, fungsi findCurrentPlace akan berjalan. Tentukan fungsi dengan kode ini setelah fungsi 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()

        }
    }

Kode ini menentukan kolom untuk meminta kemungkinan tempat, membuat FindCurrentPlaceRequest, memulai tugas, dan mengisi TextView dengan detail yang diminta.

  1. Konversikan FindCurrentPlaceResponse menjadi teks dengan menentukan fungsi ekstensi. File StringUtil.kt diberikan untuk menyederhanakan konversi respons Places SDK menjadi string yang dapat dibaca manusia.

Di akhir file CurrentPlaceActivity.kt, tentukan fungsi untuk mengonversi objek respons Current Place menjadi string.

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

Menambahkan aktivitas Current Place ke manifes

Tambahkan elemen <activity> untuk CurrentPlaceActivity sebagai turunan elemen <application> dalam file AndroidManifest.xml, yang terletak di app/src/main:

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

Menambahkan aktivitas Current Place ke menu demo

Sama seperti sebelumnya, tambahkan demo Current Place ke layar utama dengan menambahkannya ke daftar dalam modul Demo. Setelah Anda membuat aktivitas Current Place, tambahkan ke file Demo.kt di folder src/main/java/com/google/codelabs/maps/placesdemo/. Tempelkan langsung kode ini setelah item AUTOCOMPLETE_FRAGMENT_DEMO:

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

String terkait ditentukan dalam file src/main/res/values/strings.xml.

Menjalankan aplikasi

  1. Jalankan aplikasi. Kali ini Anda akan melihat tiga item dalam daftar layar utama.
  2. Ketuk baris Current Place. Anda akan melihat tombol di layar.
  3. Ketuk tombolnya. Jika Anda belum memberikan izin akses lokasi ke aplikasi ini sebelumnya, permintaan izin akan muncul.
  4. Berikan izin ke aplikasi untuk mengakses lokasi perangkat.
  5. Ketuk tombol lagi. Kali ini, daftar hingga 20 tempat-tempat terdekat dan kemungkinannya akan muncul, seperti yang ditampilkan dalam Gambar 5.

Menampilkan kemungkinan Current Place yang cocok untuk lokasi yang dilaporkan perangkat

Gambar 5. Menampilkan kemungkinan Current Place yang cocok untuk lokasi yang dilaporkan perangkat.

10. Selamat

Anda telah berhasil membuat aplikasi Android dengan Places SDK for Android.

Yang telah Anda pelajari

Apa selanjutnya?

  • Jelajahi atau fork repositori GitHub android-places-demos sampel dan demo untuk mendapatkan lebih banyak inspirasi.
  • Pelajari dari codelab Kotlin lainnya untuk membuat aplikasi Android dengan Google Maps Platform.
  • Bantu kami membuat konten yang menurut Anda paling berguna dengan menjawab pertanyaan berikut:

Apa saja codelab lain yang ingin Anda lihat?

Visualisasi data pada peta Selengkapnya tentang cara menyesuaikan gaya peta saya Membuat interaksi 3D di peta

Apakah codelab yang Anda inginkan tidak tercantum di atas? Ajukan permintaan bersama masalah baru di sini.