Android için Places SDK'yı (Kotlin) kullanmaya başlama

1. Başlamadan Önce

Bu codelab'de, Android için Yerler SDK'sını uygulamanıza nasıl entegre edeceğinizi ve Yerler SDK'sı özelliklerinin her birini nasıl kullanacağınızı öğreneceksiniz.

Yerler demo uygulaması

Ön koşullar

  • Kotlin ve Android geliştirme ile ilgili temel bilgiler

Neler öğreneceksiniz?

  • Kotlin Uzantıları ile Android için Places SDK nasıl yüklenir?
  • Belirli bir yer için Yer Ayrıntıları nasıl yüklenir?
  • Uygulamanıza Yer Otomatik Tamamlama widget'ı ekleme.
  • Cihazın bildirdiği konuma göre Mevcut Yer'i yükleme.

Gerekenler

Bu codelab'i tamamlamak için aşağıdaki hesaplara, hizmetlere ve araçlara ihtiyacınız olacaktır:

2. Hazırlanın

Aşağıdaki etkinleştirme adımı için Places API'yi etkinleştirin.

Google Haritalar Platformu'nu kurma

Henüz bir Google Cloud Platform hesabınız ve faturalandırmanın etkin olduğu bir projeniz yoksa faturalandırma hesabı ve proje oluşturmak için lütfen Google Haritalar Platformu'nu Kullanmaya Başlama kılavuzuna bakın.

  1. Cloud Console'da proje açılır menüsünü tıklayın ve bu codelab için kullanmak istediğiniz projeyi seçin.

  1. Google Cloud Marketplace'te bu codelab için gerekli olan Google Haritalar Platformu API'lerini ve SDK'larını etkinleştirin. Bunu yapmak için bu video veya bu dokümanlardaki adımları uygulayın.
  2. Cloud Console'un Kimlik Bilgileri sayfasında API anahtarı oluşturun. Bu video veya bu dokümanlardaki adımları uygulayabilirsiniz. Google Haritalar Platformu'na gönderilen tüm istekler bir API anahtarı gerektirir.

3. Hızlı başlangıç

Mümkün olduğunca hızlı bir şekilde başlamanızı sağlamak için başlangıç kodunu indirerek bu codelab'i takip etmenize yardımcı olabilir. Çözüme geçebilirsiniz, ancak çözümü derlemek için tüm adımları izlemek isterseniz okumaya devam edin.

  1. git dosyasını yüklediyseniz depoyu klonlayın.
git clone https://github.com/googlemaps/codelab-places-101-android.git

Alternatif olarak, kaynak kodunu indirmek için bu düğmeyi tıklayın.

  1. Kodu indirdikten sonra Android Studio'daki /starter dizininde bulunan projeyi açın. Bu proje, codelab'i tamamlamak için ihtiyaç duyacağınız temel dosya yapısını içerir. Üzerinde çalışmanız gereken her şey /starter dizininde bulunur.

Çalışan çözüm kodunun tamamını görmek istiyorsanız /solution dizininde tamamlanan kodu görüntüleyebilirsiniz.

4. Android için Yerler SDK'sını yükleme

Bu bölümde, Android için Yerler SDK'sını uygulamanızın bağımlılıklarına eklersiniz.

API anahtarınızı ekleme

Android için Yerler SDK'sının anahtarınızı uygulamanızla ilişkilendirebilmesi amacıyla önceden oluşturduğunuz API anahtarını uygulamaya verin.

  1. Projenizin kök dizininde (gradle.properties ve settings.gradle öğelerinin yer aldığı seviyede) local.properties adlı dosyayı açın.
  2. Yeni anahtar GOOGLE_MAPS_API_KEY tanımlayıp değerini, oluşturduğunuz API anahtarı olarak ayarlayın.

local.properties

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

local.properties değerinin Git deposundaki .gitignore dosyasında listelendiğine dikkat edin. Bunun nedeni, API anahtarınızın hassas bilgi olarak kabul edilmesi ve mümkünse kaynak kontrolüne dahil edilmemesi gerektiğidir.

  1. Ardından, API anahtarınızı uygulamanızın tamamında kullanılabilmesi için açığa çıkarmak amacıyla uygulamanızın build.gradle dizininde Secrets Gradle Plugin for Android eklentisini dahil edin ve aşağıdaki satırı plugins blokuna ekleyin:

uygulama düzeyinde build.gradle

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. Proje düzeyindeki build.gradle dosyanızı aşağıdaki sınıf yolunu içerecek şekilde değiştirin:

proje düzeyinde build.gradle

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

Bu eklenti, local.properties dosyanızda tanımladığınız anahtarları, Android manifest dosyasında derleme değişkenleri olarak ve derleme sırasında Gradle tarafından oluşturulan BuildConfig sınıfında değişkenler olarak kullanılabilir hale getirir. Bu eklentinin kullanılması, local.properties uygulamasında bulunan özelliklerin okunması için gerekebilecek ortak kodu kaldırır. Böylece uygulamanız genelinde erişilebilir hale gelir.

Android bağımlılığı için Yerler SDK'sını ekleme

  1. Artık API anahtarınıza uygulamanın içinden erişilebilir. Artık Android için Places SDK'yı uygulamanızın build.gradle dosyasına ekleyin.

Bu codelab ile birlikte gelen başlangıç projesinde bu bağımlılık sizin için zaten eklenmiştir.

uygulama düzeyinde build.gradle

dependencies {
   // Dependency to include Places SDK for Android
   implementation 'com.google.android.libraries.places:places:2.6.0'
}
  1. Uygulamayı çalıştırın.

Artık boş ekran olan bir uygulama göreceksiniz. Bu ekranı üç demoyla doldurmaya devam edin.

5. Yerler Android KTX'i Yükle

Bir veya daha fazla Google Haritalar Platformu Android SDK'sı kullanan Kotlin uygulamaları için Kotlin uzantısı (KTX) kitaplıkları, eş yordam, uzantı özellikleri/işlevleri gibi Kotlin dili özelliklerinden yararlanmanızı sağlar. Her Google Haritalar SDK'sı, aşağıda gösterildiği gibi ilgili bir KTX kitaplığına sahiptir:

Google Haritalar Platformu KTX Şeması

Bu görevde uygulamanızda Kotlin'e özel dil özelliklerini kullanmak için Places Android KTX kitaplığını kullanın.

Yerler Android KTX bağımlılığı ekleme

Kotlin'e özgü özelliklerden yararlanmak için bu SDK'ya karşılık gelen KTX kitaplığını uygulama düzeyindeki build.gradle dosyanıza ekleyin.

build.gradle

dependencies {
    // ...

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

6. Yerler İstemcisini İlk Kullanıma Hazırlama

Uygulama kapsamı için Places SDK'yı başlatma

app/src/main/java/com/google/codelabs/maps/placesdemo klasörünün DemoApplication.kt dosyasında, Android için Yerler SDK'sını başlatın. Aşağıdaki işlevleri onCreate işlevinin sonuna yapıştırın:

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

Uygulamanızı oluştururken Secrets Gradle Plugin for Android, local.properties dosyanızdaki API anahtarını BuildConfig.GOOGLE_MAPS_API_KEY olarak kullanılabilir hale getirir.

Uygulama dosyasını manifest dosyasına ekleyin

Application öğesini DemoApplication ile genişlettiğiniz için manifest dosyasını güncellemeniz gerekiyor. android:name özelliğini, app/src/main içinde bulunan AndroidManifest.xml dosyasındaki application öğesine ekleyin:

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

Bu kod, uygulama manifestini src/main/java/com/google/codelabs/maps/placesdemo/ klasöründeki DemoApplication sınıfına yönlendirir.

7. Getirme Yeri Ayrıntıları

Ayrıntılar ekranı oluşturma

app/src/main/res/layout/ klasöründe, boş LinearLayout içeren bir activity_details.xml düzeni bulunur. Aşağıdaki kodu <LinearLayout> köşeli parantezleri arasına ekleyerek doğrusal düzeni doldurun.

    <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" />

Bu kod, kullanıcının herhangi bir Yer Kimliği girebileceği veya sağlanan varsayılanı kullanabileceği bir metin giriş alanı, Yer Ayrıntıları isteğini başlatmak için bir düğme ve yanıttaki bilgileri görüntülemek için bir Metin Görünümü ekler. İlişkilendirilmiş dizeler src/main/res/values/strings.xml dosyasında sizin için tanımlanır.

Ayrıntılar etkinliği oluşturma

  1. src/main/java/com/google/codelabs/maps/placesdemo/ klasöründe bir DetailsActivity.kt dosyası oluşturun ve bu dosyayı az önce oluşturduğunuz düzenle ilişkilendirin. Bu kodu dosyaya yapıştırın:
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. Bu etkinlikle kullanmak için bir Yerler İstemcisi oluşturun. Bu kodu, onCreate işlevinde görünüm nesnesi ayarlandıktan sonra yapıştırın.
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. Yerler İstemcisi ayarlandıktan sonra düğmeye bir tıklama dinleyici ekleyin. Bu kodu, onCreate işlevinde Yerler İstemcisi oluşturma işleminden sonra yapıştırın.
        // 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
                }
            }
        }

Bu kod, giriş alanına girilen Yer Kimliğini alır, yer için hangi alanların isteneceğini tanımlar, bir FetchPlaceRequest oluşturur, görevi başlatır ve başarıyı ya da başarısızlığı dinler. İstek başarılı olursa işlev, TextView öğesini istenen ayrıntılarla doldurur.

  1. Bir uzantı işlevi tanımlayarak FetchPlaceResponse öğesini metne dönüştürün. Yerler SDK'sı yanıtlarını insanların okuyabileceği dizelere dönüştürmek için bir StringUtil.kt dosyası sağlanır.

DetailsActivity.kt dosyasının sonunda, Fetch Place yanıt nesnesini dizeye dönüştürecek bir işlev tanımlayın.

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

Ayrıntılar etkinliğini manifest dosyasına ekleme

app/src/main içinde bulunan AndroidManifest.xml dosyasındaki <application> öğesinin alt öğesi olarak DetailsActivity için bir <activity> öğesi ekleyin:

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

Ayrıntılar etkinliğini demo menüsüne ekleyin

Ana ekranda kullanılabilir demoları listelemek için boş bir Demo modülü sağlanır. Bir Yer Ayrıntıları etkinliği oluşturduğunuza göre şimdi bu kodu src/main/java/com/google/codelabs/maps/placesdemo/ klasöründeki Demo.kt dosyasına ekleyin:

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

İlişkilendirilmiş dizeler src/main/res/values/strings.xml dosyasında tanımlanmıştır.

MainActivity.kt öğesini inceleyin ve Demo modülünün içeriği üzerinden yeniden doldurulmuş bir ListView oluşturduğuna dikkat edin. Kullanıcı listedeki bir öğeye dokunursa tıklama işleyici, ilişkilendirilen etkinliği açar.

Uygulamayı çalıştır

  1. Uygulamayı çalıştırın. Bu kez, listede Yer Ayrıntıları demosunu gösteren bir öğe görmeniz gerekir.
  2. Yer Ayrıntıları metnine dokunun. Oluşturduğunuz görünümü, bir giriş alanı ve düğmeyle göreceksiniz.
  3. "AYRINTILARI AL" düğmesine dokunun. Varsayılan Yer Kimliğini kullandıysanız Şekil 1'de gösterilen şekilde yer adını, adresini ve harita koordinatlarını görebilirsiniz.

Yanıt veren Yer Ayrıntıları etkinliği

1. Şekil. Yanıtın gösterildiği Yer Ayrıntıları etkinliği.

8. Yer Otomatik Tamamlama Ekle

Otomatik Tamamlama ekranı oluşturma

app/src/main/res/layout/ klasöründe, boş LinearLayout içeren bir activity_autocomplete.xml düzeni sağlanır. Bu kodu <LinearLayout> köşeli parantezlerinin arasına ekleyerek doğrusal düzeni doldurun.

    <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" />

Bu kod, yanıttaki bilgileri görüntülemek için bir AutocompleteSupportFragment widget'ı ve bir TextView ekler. İlişkilendirilmiş dizeler src/main/res/values/strings.xml dosyasında tanımlanmıştır.

Otomatik Tamamlama etkinliği oluşturma

  1. src/main/java/com/google/codelabs/maps/placesdemo/ klasöründe bir AutocompleteActivity.kt dosyası oluşturun ve bu kodu şu kodla tanımlayın:
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
    }
}

Bu kod, etkinliği, düzen dosyasında tanımladığınız görünümler ve AutocompleteSupportFramgent ile ilişkilendirir.

  1. Daha sonra, kullanıcı Yer Otomatik Tamamlama tarafından sunulan tahminlerden birini seçtiğinde ne olacağını tanımlayın. Bu kodu, onCreate işlevinin sonuna ekleyin:
        // 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()
                }
            }

Bu kod, yer için hangi alanların isteneceğini tanımlar, bir yer seçimi etkinliğini ve başarı veya başarısızlığı dinler. İstek başarılı olursa işlev, TextView'u yer ayrıntılarıyla doldurur. Yer Otomatik Tamamlama özelliğinin, Yer nesnesi döndürdüğünü unutmayın. Yer Otomatik Tamamlama widget'ını kullanırken ayrı bir Yer Ayrıntıları isteğinde bulunmanıza gerek yoktur.

Otomatik tamamlama etkinliğini manifest dosyasına ekleyin

app/src/main içinde bulunan AndroidManifest.xml dosyasındaki <application> öğesinin alt öğesi olarak AutocompleteActivity için bir <activity> öğesi ekleyin:

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

Otomatik tamamlama etkinliğini demo menüsüne ekleyin

Daha önce olduğu gibi, Demo modülündeki listeye ekleme yaparak Ana Sayfa otomatik tamamlama demosunu ana ekrana ekleyin. Bir Yer Otomatik Tamamlama etkinliği oluşturduğunuza göre bunu src/main/java/com/google/codelabs/maps/placesdemo/ klasöründeki Demo.kt dosyasına ekleyin. Bu kodu DETAILS_FRAGMENT_DEMO öğesinden hemen sonra yapıştırın:

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

İlişkilendirilmiş dizeler src/main/res/values/strings.xml dosyasında tanımlanmıştır.

Uygulamayı çalıştır

  1. Uygulamayı çalıştırın. Bu kez ana ekran listesinde iki öğe göreceksiniz.
  2. Otomatik Yer Tamamlama satırına dokunun. Şekil 2'de gösterildiği gibi bir Yer Otomatik Tamamlama girişi pop-up'ı göreceksiniz.
  3. Bir yerin adını yazmaya başlayın. Bu bir kuruluş adı, adres veya coğrafi bölge olabilir. Tahminler, siz yazdıkça sunulmalıdır.
  4. Tahminlerden birini seçin. Tahminlerin kaybolması ve TextView'un seçilen yer ile ilgili ayrıntıları Şekil 3'te gösterildiği gibi göstermesi gerekir.

Kullanıcı giriş alanına dokunduktan sonra otomatik tamamlama etkinliği

2. Şekil. Kullanıcı, giriş alanına dokunduktan sonra otomatik tamamlama etkinliği.

Kullanıcı &ldquo;Niagara Şelaleleri&rdquo;seçip seçtikten sonra otomatik tamamlama etkinliği

3. Şekil. Kullanıcı "Niagara Şelaleleri" yazıp seçtiğinde Yer Ayrıntılarını gösteren otomatik tamamlama etkinliği.

9. Cihazın Mevcut konumunu alın

Mevcut Yer ekranı oluşturma

app/src/main/res/layout/ klasöründe, boş LinearLayout içeren bir activity_current.xml düzeni sağlandı. Aşağıdaki kodu <LinearLayout> köşeli parantezleri arasına ekleyerek doğrusal düzeni doldurun.

    <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" />

Mevcut Yer etkinliği oluşturma

  1. src/main/java/com/google/codelabs/maps/placesdemo/ klasöründe bir CurrentActivity.kt dosyası oluşturun ve bunu şu kodla tanımlayın:
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()
        }
    }
}

Bu kod, etkinliği düzen dosyasında tanımladığınız görünümlerle ilişkilendirir. Ayrıca, düğme tıklandığında checkPermissionThenFindCurrentPlace işlevini çağırmak için düğmeye bir tıklama dinleyici ekler.

  1. Tam konum iznini kontrol etmek için checkPermissionThenFindCurrentPlace() tanımlayın ve henüz verilmediyse izin isteyin. Bu kodu onCreate işlevinden sonra yapıştırın.
    /**
     * 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. checkPermissionThenFindCurrentPlace işlevinin else dalgası requestPermissions çağırdığında, uygulama kullanıcıya bir izin isteği iletişim kutusu gösterir. Kullanıcı, Android 12'den düşük bir işletim sistemi çalıştıran bir cihaz çalıştırıyorsa yalnızca tam (tam) konum izni verebilir. Kullanıcı Android 12 veya sonraki bir sürümü çalıştıran bir cihaz kullanıyorsa Şekil 4'te gösterildiği gibi kullanıcıya tam (ince) konum yerine yaklaşık (yaklaşık) konum sağlama seçeneği sunulur.

Android 12 veya üzerini çalıştıran bir cihazda kullanıcı izni isteme

4. Şekil. Android 12 veya sonraki sürümleri çalıştıran bir cihazda kullanıcı izni istemek, tam veya yaklaşık konum verme seçeneği sunar.

Kullanıcı sistem izinleri iletişim kutusuna yanıt verdikten sonra sistem, uygulamanızın onRequestPermissionsResult uygulamasını çağırır. Sistem, tanımladığınız izin isteğinin yanı sıra izin iletişim kutusuna kullanıcı yanıtını iletir. Aşağıdaki kodu checkPermissionThenFindCurrentPlace altına yapıştırarak, mevcut Yer etkinliğiyle ilgili konum izinlerinin istek kodunu işlemek için onRequestPermissionResult kodunu geçersiz kılın.

    @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. İzin verildikten sonra findCurrentPlace işlevi çalışır. onRequestPermissionsResult işlevinden sonra işlevi bu kodla tanımlayın.
    /**
     * 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()

        }
    }

Bu kod, olası alanlar için hangi alanların isteneceğini tanımlar, bir FindCurrentPlaceRequest oluşturur, görevi başlatır ve TextView'u istenen ayrıntılarla doldurur.

  1. Bir uzantı işlevi tanımlayarak FindCurrentPlaceResponse öğesini metne dönüştürün. Yerler SDK'sı yanıtlarını insanların okuyabileceği dizelere dönüştürmek için bir StringUtil.kt dosyası sağlanır.

CurrentPlaceActivity.kt dosyasının sonunda, Mevcut Yer yanıtı nesnesini dizeye dönüştürecek bir işlev tanımlayın.

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

Mevcut Yer etkinliğini manifest dosyasına ekleme

app/src/main içinde bulunan AndroidManifest.xml dosyasındaki <application> öğesinin alt öğesi olarak CurrentPlaceActivity için bir <activity> öğesi ekleyin:

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

Demo menüsüne Mevcut Yer etkinliği ekleyin

Daha önce olduğu gibi, Demo modülünde bulunan listeyi listeye ekleyerek Geçerli Yer demosunu ana ekrana ekleyin. Mevcut bir Yer etkinliği oluşturduğunuza göre şimdi src/main/java/com/google/codelabs/maps/placesdemo/ klasöründeki Demo.kt dosyasına ekleyin. Bu kodu AUTOCOMPLETE_FRAGMENT_DEMO öğesinden hemen sonra yapıştırın:

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

İlişkilendirilmiş dizeler src/main/res/values/strings.xml dosyasında tanımlanmıştır.

Uygulamayı çalıştır

  1. Uygulamayı çalıştırın. Bu kez ana ekran listesinde üç öğe görmeniz gerekir.
  2. Mevcut Yer satırına dokunun. Ekranda bir düğme görürsünüz.
  3. Düğmeye dokunun. Bu uygulamaya daha önce konum izni vermediyseniz bir izin isteği görüntülenir.
  4. Cihazın konumuna erişmesi için uygulamaya izin verin.
  5. Düğmeye tekrar dokunun. Bu kez, Şekil 5'te gösterildiği gibi, yakındaki en fazla 20 yerin ve olasılıklarının bir listesi görüntülenir.

Cihazın bildirdiği konum için geçerli Mevcut Yer eşleşmeleri gösteriliyor

5. Şekil. Cihazın bildirdiği konum için geçerli Mevcut Yer eşleşmeleri gösteriliyor.

10. Tebrikler

Android için Yerler SDK'sı ile başarılı bir şekilde bir Android uygulaması oluşturdunuz.

Öğrendikleriniz

Sonraki adım

  • Daha fazla ilham almak için android-places-demos GitHub veri deposundaki örnekleri veya demoları keşfedin ya da çatallayın.
  • Google Haritalar Platformu ile Android uygulamaları geliştirmek için daha fazla Kotlin codelab'i hakkında bilgi edinin.
  • Aşağıdaki soruları cevaplayarak en çok yararlanacağınız içerikleri oluşturmamıza yardımcı olun:

Başka hangi codelab'leri görmek istersiniz?

Haritalarda veri görselleştirme Haritalarımın stilini özelleştirme hakkında daha fazla bilgi Haritalarda 3D etkileşimler için geliştirme

İstediğiniz codelab'de liste yok mu? Yeni bir sorun için istekte bulunun.