Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách tìm vĩ độ và kinh độ từ địa chỉ trên Android bằng Kotlin

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ị.