Giới thiệu
Bài viết này hướng dẫn cách tìm vĩ độ (latitude) và kinh độ (longitude) từ địa chỉ trên Android sử dụng Kotlin và Geocoder API.
Các bước thực hiện
Bước 1: Tạo dự án mới
Mở Android Studio, chọn File → New Project và điền đầy đủ thông tin để tạo dự án mới.
Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textViewAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:text="Nhập địa chỉ: "
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold" />
<EditText
android:id="@+id/editTextAddress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/textViewAddress"
android:singleLine="true"
android:text="" />
<Button
android:id="@+id/addressButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textViewAddress"
android:layout_marginTop="50dp"
android:layout_toEndOf="@+id/textViewAddress"
android:text="Hiển thị Vĩ độ/Kinh độ" />
<TextView
android:id="@+id/latLongTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/textViewAddress"
android:text=""
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@android:color/background_dark" />
</RelativeLayout>
Bước 3: Viết MainActivity (src/MainActivity.kt)
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var addressButton: Button
private lateinit var textViewAddress: TextView
lateinit var textViewLatLong: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
textViewAddress = findViewById(R.id.textViewAddress)
textViewLatLong = findViewById(R.id.latLongTV)
addressButton = findViewById(R.id.addressButton)
addressButton.setOnClickListener {
val editText = findViewById<EditText>(R.id.editTextAddress)
val address = editText.text.toString()
val locationAddress = GeoCodingLocation()
locationAddress.getAddressFromLocation(address, applicationContext, GeoCoderHandler(this))
}
}
companion object {
private class GeoCoderHandler(private val mainActivity: MainActivity) : Handler() {
override fun handleMessage(message: Message) {
val locationAddress: String? = when (message.what) {
1 -> {
val bundle = message.data
bundle.getString("address")
}
else -> null
}
mainActivity.textViewLatLong.text = locationAddress
}
}
}
}
Bước 4: Tạo lớp GeoCodingLocation.kt
import android.content.Context
import android.location.Address
import android.location.Geocoder
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.util.Log
import java.io.IOException
import java.util.*
class GeoCodingLocation {
private val TAG = "GeoCodeLocation"
fun getAddressFromLocation(locationAddress: String, context: Context, handler: Handler) {
val thread = object : Thread() {
override fun run() {
val geoCoder = Geocoder(context, Locale.getDefault())
var result: String? = null
try {
val addressList = geoCoder.getFromLocationName(locationAddress, 1)
if (addressList != null && addressList.size > 0) {
val address = addressList.get(0) as Address
val sb = StringBuilder()
sb.append(address.latitude).append("\n")
sb.append(address.longitude).append("\n")
result = sb.toString()
}
} catch (e: IOException) {
Log.e(TAG, "Unable to connect to GeoCoder", e)
} finally {
val message = Message.obtain()
message.target = handler
message.what = 1
val bundle = Bundle()
result = ("Address: $locationAddress" + "\n\nLatitude and Longitude: \n" + result)
bundle.putString("address", result)
message.data = bundle
message.sendToTarget()
}
}
}
thread.start()
}
}
Bước 5: Cấu hình Manifest (androidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.q11">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Chạy ứng dụng
Kết nối thiết bị Android thực với máy tính. Trong Android Studio, mở file activity và nhấn biểu tượng Run trên thanh công cụ. Chọn thiết bị di động của bạn và kiểm tra màn hình hiển thị.