Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีเปลี่ยนชื่อประเทศปัจจุบันใน Android (Geocoder)

ภาพรวม

บทความนี้สาธิตการใช้ 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) ไม่ส่งผลต่อ:
  • การตั้งค่าภาษา/ภูมิภาคของระบบ (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"/>