ภาพรวม
บทความนี้สาธิตการใช้ Geocoder และ Address.setCountryName() เพื่อเปลี่ยนชื่อประเทศในออบเจ็กต์ Address หมายเหตุ: ไม่ได้เปลี่ยนตั้งค่าระบบจริง เพียงแค่แก้ไขออบเจ็กต์ในหน่วยความจำเท่านั้น
โค้ดสำคัญ
Address address = addresses.get(0);
address.setCountryName("London"); // ตั้งค่าในออบเจ็กต์ Address
textView.setText("" + address.getCountryName()); // แสดง "London"
Geocoder และ Address Class
Geocoder: แปลงพิกัด ↔ ที่อยู่ (ต้องการ Backend Service / Network)Address: โครงสร้างข้อมูลที่อยู่ มี Setter/Getter สำหรับแต่ละส่วน- setCountryName(): ตั้งค่าชื่อประเทศในออบเจ็กต์ (Local only)
Address Fields ที่แก้ไขได้ (Mutable)
address.setCountryName("Thailand");
address.setCountryCode("TH");
address.setAdminArea("Bangkok");
address.setSubAdminArea("Phra Nakhon");
address.setLocality("Bangkok");
address.setSubLocality("Wat Phra Kaew");
address.setThoroughfare("Na Phra Lan Road");
address.setSubThoroughfare("123");
address.setPostalCode("10200");
address.setFeatureName("Grand Palace");
address.setPhone("02-123-4567");
address.setUrl("https://example.com");
ข้อจำกัดสำคัญ
⚠️ ไม่ได้เปลี่ยนการตั้งค่าระบบ (System Settings)
เมธอดเหล่านี้แก้ไขเฉพาะออบเจ็กต์ Address ในหน่วยความจำ (In-memory) ไม่ส่งผลต่อ:
เมธอดเหล่านี้แก้ไขเฉพาะออบเจ็กต์ Address ในหน่วยความจำ (In-memory) ไม่ส่งผลต่อ:
- การตั้งค่าภาษา/ภูมิภาคของระบบ (Settings.System.LOCALE)
- Location Provider หรือ GPS
- SIM Card / Carrier Country Code
- แอปอื่นๆ หรือระบบปฏิบัติการ
การเปลี่ยน Locale/Region จริงของระบบ (ต้อง Root/System App)
// ต้องเป็น System App หรือมี Signature Permission
Settings.System.putString(contentResolver, Settings.System.LOCALE, "th_TH");
// หรือ
LocaleManager localeManager = (LocaleManager) getSystemService(LOCALE_SERVICE);
localeManager.setApplicationLocales(new LocaleList(Locale.forLanguageTag("th-TH"))); // API 33+
กรณีใช้งานจริงของ setCountryName()
- ทดสอบ UI หลายภาษา/ประเทศโดยไม่ต้องเปลี่ยนตั้งค่าโทรศัพท์
- สร้างที่อยู่จำลองสำหรับการพัฒนา/ทดสอบ
- Override ข้อมูลที่ Geocoder คืนมาให้ตรงกับความต้องการ
Manifest
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/>