Mengatasi GeoCoder.getFromLocation deprecated

Ahmad Arif Faizin
3 min readMay 8, 2023

--

Geocoding sendiri adalah proses untuk mendapatkan titik koordinat dari alamat yang sudah ditentukan. Dari sini kita tahu bahwa reverse geocoding merupakan proses sebaliknya, yakni mendapatkan alamat dari titik koordinat.

Berikut ini adalah kode yang digunakan untuk mengonversi titik koordinat menjadi alamat.

private fun getAddressName(lat: Double, lon: Double): String? {
var addressName: String? = null
val geocoder = Geocoder(this@MapsActivity, Locale.getDefault())
try {
val list = geocoder.getFromLocation(lat, lon, 1)
if (list != null && list.size != 0) {
addressName = list[0].getAddressLine(0)
Log.d(TAG, "getAddressName: $addressName")
}
} catch (e: IOException) {
e.printStackTrace()
}
return addressName
}

Pertama, inisialisasi terlebih dahulu Geocoder beserta dengan Locale yang akan digunakan. Kemudian gunakan fungsi getFromLocation dengan parameter pertama dan kedua berisi latitude dan longitude. Sedangkan pada parameter ketiga bernilai 1, artinya maksimal hasil yang diberikan hanyalah satu. Hal ini karena mungkin saja terdapat berbagai kemungkinan alamat pada satu titik koordinat tersebut. Untuk itulah hasil dari fungsi ini berupa List.

Hal lain yang perlu diperhatikan adalah bisa saja tidak ada alamat pada titik tersebut, contohnya seperti di laut atau tengah danau. Untuk itulah kita perlu pengecekan terlebih dahulu. Apabila terdapat data kita bisa mengambil data alamat dengan menggunakan fungsi getAddressLine(0). Artinya adalah data alamat pertama yang ada pada List. Selain alamat lengkap, Anda juga bisa mengambil data spesifik dengan fungsi lainnya. Berikut adalah gambarannya:

  • AddressLine : Orchid Forest Cikole, Genteng, Cikole, Kec. Lembang, Kabupaten Bandung Barat, Jawa Barat 40391, Indonesia
  • FeatureName : Orchid Forest Cikole
  • Thoroughfare : Genteng
  • Sub Locality : Cikole
  • Locality : Kecamatan Lembang
  • Sub Admin Area : Kabupaten Bandung Barat
  • Admin Area : Jawa Barat
  • Postal Code : 40391
  • Country Name : Indonesia

Keren kan? Jadi, jika ingin menampilkan data kecamatan dan provinsi saja, Anda bisa menggunakan data locality dan admin area saja.

Sayangnya, untuk Anda yang menarget API Level 33 ke atas, Anda akan menemui bahwa kode tersebut sudah deprecated.

Hal ini karena sebenarnya terdapat proses untuk mengambil data yang memblokir thread pada kode tersebut. Lalu, bagaimana cara untuk mengatasinya.?

Checkitout…

Untuk mengatasinya, dibuatlah API baru dengan tambahan listener ada parameter terakhir.

Kira kira begini hasil jadinya

private fun getAddressName(lat: Double, lon: Double): String? {
var addressName: String? = null
val geocoder = Geocoder(this@MapsActivity, Locale.getDefault())
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
geocoder.getFromLocation(lat, lon, 1) { list ->
if (list.size != 0) {
addressName = list[0].getAddressLine(0)
Log.d(TAG, "getAddressName: $addressName")
//show Marker
}
}
} else {
try {
val list = geocoder.getFromLocation(lat, lon, 1)
if (list != null && list.size != 0) {
addressName = list[0].getAddressLine(0)
Log.d(TAG, "getAddressName: $addressName")
}
} catch (e: IOException) {
e.printStackTrace()
}
}
return addressName
}

Sample from Google

location, location, location!

— Lord Harold Samuel

--

--

No responses yet