Bu codelab hakkında
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.
Ö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:
- Faturalandırmanın etkin olduğu bir Google Hesabı.
- Android Studio Bumblebee veya daha yeni bir sürüm.
- Android Studio'da yüklü olan Google Play hizmetleri.
- Google API'leri Android 8 veya üzeri sürümlere sahip bir Android cihaz ya da Android emülatörü (yükleme adımları için Android Emülatör'de uygulama çalıştırma konusuna bakın).
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.
- Cloud Console'da proje açılır menüsünü tıklayın ve bu codelab için kullanmak istediğiniz projeyi seçin.
- 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.
- 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.
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.
- 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.
- Projenizin kök dizininde (
gradle.properties
vesettings.gradle
öğelerinin yer aldığı seviyede)local.properties
adlı dosyayı açın. - 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.
- 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'
}
- 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
- 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'
}
- 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:
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
src/main/java/com/google/codelabs/maps/placesdemo/
klasöründe birDetailsActivity.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)
}
}
- 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)
- 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.
- 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 birStringUtil.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
- Uygulamayı çalıştırın. Bu kez, listede Yer Ayrıntıları demosunu gösteren bir öğe görmeniz gerekir.
- Yer Ayrıntıları metnine dokunun. Oluşturduğunuz görünümü, bir giriş alanı ve düğmeyle göreceksiniz.
- "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.
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
src/main/java/com/google/codelabs/maps/placesdemo/
klasöründe birAutocompleteActivity.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.
- 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
- Uygulamayı çalıştırın. Bu kez ana ekran listesinde iki öğe göreceksiniz.
- Otomatik Yer Tamamlama satırına dokunun. Şekil 2'de gösterildiği gibi bir Yer Otomatik Tamamlama girişi pop-up'ı göreceksiniz.
- 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.
- 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.
2. Şekil. Kullanıcı, giriş alanına dokunduktan 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
src/main/java/com/google/codelabs/maps/placesdemo/
klasöründe birCurrentActivity.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.
- Tam konum iznini kontrol etmek için
checkPermissionThenFindCurrentPlace()
tanımlayın ve henüz verilmediyse izin isteyin. Bu koduonCreate
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
}
checkPermissionThenFindCurrentPlace
işlevininelse
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.
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()
}
- İ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.
- 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 birStringUtil.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
- Uygulamayı çalıştırın. Bu kez ana ekran listesinde üç öğe görmeniz gerekir.
- Mevcut Yer satırına dokunun. Ekranda bir düğme görürsünüz.
- Düğmeye dokunun. Bu uygulamaya daha önce konum izni vermediyseniz bir izin isteği görüntülenir.
- Cihazın konumuna erişmesi için uygulamaya izin verin.
- 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.
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
- Android için Yerler SDK'sını yükleme ve yapılandırma.
- Android için Yerler SDK'sı için Kotlin Uzantıları yükleniyor.
- Yer Ayrıntıları yükleniyor.
- Yer Otomatik Tamamlama ekleniyor.
- Mevcut Yer alınıyor.
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?
İstediğiniz codelab'de liste yok mu? Yeni bir sorun için istekte bulunun.