ภาพรวม
ตัวอย่างนี้สาธิตการแปลงที่อยู่ (Address) เป็น พิกัดภูมิศาสตร์ (Latitude/Longitude) โดยใช้ Geocoder
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
เปิด Android Studio → File → New Project และกรอกข้อมูลที่จำเป็น
ขั้นตอนที่ 2: เลย์เอาต์ (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="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/textViewAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter Address"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_alignParentStart="true" />
<EditText
android:id="@+id/editTextAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/textViewAddress"
android:singleLine="true"
android:hint="กรอกที่อยู่" />
<Button
android:id="@+id/addressButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show Lat/Long"
android:layout_below="@+id/textViewAddress"
android:layout_toEndOf="@+id/textViewAddress"
android:layout_marginTop="50dp" />
<TextView
android:id="@+id/latLongTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/textViewAddress" />
</RelativeLayout>
ขั้นตอนที่ 3: Activity หลัก (src/MainActivity.java)
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Button addressButton;
TextView textViewAddress;
TextView textViewLatLong;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewAddress = findViewById(R.id.textViewAddress);
textViewLatLong = findViewById(R.id.latLongTV);
addressButton = findViewById(R.id.addressButton);
addressButton.setOnClickListener(v -> {
EditText editText = findViewById(R.id.editTextAddress);
String address = editText.getText().toString().trim();
if (address.isEmpty()) {
textViewLatLong.setText("กรุณากรอกที่อยู่");
return;
}
GeoCodingLocation locationAddress = new GeoCodingLocation();
locationAddress.getAddressFromLocation(
address,
getApplicationContext(),
new GeoCoderHandler()
);
});
}
private class GeoCoderHandler extends Handler {
@Override
public void handleMessage(Message message) {
String locationAddress;
switch (message.what) {
case 1:
Bundle bundle = message.getData();
locationAddress = bundle.getString("address");
break;
default:
locationAddress = null;
}
textViewLatLong.setText(locationAddress);
}
}
}
ขั้นตอนที่ 4: คลาส Geocoding (GeoCodeLocation.java)
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.List;
import java.util.Locale;
class GeoCodeLocation {
private static final String TAG = "GeoCodeLocation";
public static void getAddressFromLocation(final String locationAddress,
final Context context,
final Handler handler) {
Thread thread = new Thread() {
@Override
public void run() {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
String result = null;
try {
List<Address> addressList = geocoder.getFromLocationName(locationAddress, 1);
if (addressList != null && !addressList.isEmpty()) {
Address address = addressList.get(0);
StringBuilder sb = new StringBuilder();
sb.append("Latitude: ").append(address.getLatitude()).append("\n");
sb.append("Longitude: ").append(address.getLongitude()).append("\n");
result = sb.toString();
}
} catch (IOException e) {
Log.e(TAG, "Unable to connect to Geocoder", e);
} finally {
Message message = Message.obtain();
message.setTarget(handler);
if (result != null) {
message.what = 1;
Bundle bundle = new Bundle();
result = "Address: " + locationAddress + "\n\nLatitude and Longitude:\n" + result;
bundle.putString("address", result);
message.setData(bundle);
} else {
message.what = 1;
Bundle bundle = new Bundle();
result = "Address: " + locationAddress + "\n Unable to get Latitude and Longitude for this address location.";
bundle.putString("address", result);
message.setData(bundle);
}
message.sendToTarget();
}
}
};
thread.start();
}
}
ขั้นตอนที่ 5: AndroidManifest.xml (เพิ่ม Permissions)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<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>
การทดสอบ
รันแอป กรอกที่อยู่ เช่น "Bangkok, Thailand" กดปุ่ม Show Lat/Long จะแสดงพิกัด

คำแนะนำเพิ่มเติม
- Geocoder ต้องการ Internet - ต้องมีสิทธิ์ INTERNET
- รันบน Background Thread - ไม่ให้รันบน Main Thread (ANR)
- จำกัดอัตราการเรียก (Rate Limit) - ไม่ควรเรียกบ่อยเกินไป
- ผลลัพธ์อาจไม่แม่นยำ 100% - ขึ้นกับข้อมูล Google Maps
ทางเลือกสมัยใหม่: Google Maps Geocoding API
สำหรับ Production ควรใช้ REST API แทน:
https://maps.googleapis.com/maps/api/geocode/json?address=Bangkok&key=YOUR_API_KEY
ให้ผลลัพธ์แม่นยำกว่า มี Quota และ Billing ต้องตั้งค่าใน Google Cloud Console