如何获取Android设备当前选中的地区/国家代码?
获取Android设备当前选中地区代码(实时更新方案)
一、直接获取地区代码
Android系统中独立于语言的地区设置,可通过系统设置API获取,分版本处理:
1. Android 7.0(API 24)及以上
系统提供Settings.Secure.REGION_SETTING键直接读取:
import android.content.ContentResolver; import android.provider.Settings; public String getCurrentRegionCode() { ContentResolver resolver = getContentResolver(); return Settings.Secure.getString(resolver, Settings.Secure.REGION_SETTING); }
返回结果为ISO 3166-1 alpha-2格式的两位地区代码(如US、UK)。
2. Android 7.0以下版本
低版本系统可读取Settings.System中的user_country键:
import android.content.ContentResolver; import android.provider.Settings; public String getCurrentRegionCodePreN() { ContentResolver resolver = getContentResolver(); return Settings.System.getString(resolver, "user_country"); }
二、监听地区设置实时变更
通过注册ContentObserver监听设置变化,实现实时更新:
1. 注册与注销监听
import android.database.ContentObserver; import android.os.Build; import android.os.Handler; import android.provider.Settings; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ContentObserver regionChangeObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化监听观察者 regionChangeObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // 地区变更时重新获取代码并处理 String newRegionCode = Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? getCurrentRegionCode() : getCurrentRegionCodePreN(); // 这里添加你的业务逻辑,比如更新UI } }; // 根据系统版本注册监听 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { getContentResolver().registerContentObserver( Settings.Secure.getUriFor(Settings.Secure.REGION_SETTING), false, regionChangeObserver ); } else { getContentResolver().registerContentObserver( Settings.System.getUriFor("user_country"), false, regionChangeObserver ); } } @Override protected void onDestroy() { super.onDestroy(); // 注销监听,避免内存泄漏 if (regionChangeObserver != null) { getContentResolver().unregisterContentObserver(regionChangeObserver); } } // 复用前面的获取方法 private String getCurrentRegionCode() { ContentResolver resolver = getContentResolver(); return Settings.Secure.getString(resolver, Settings.Secure.REGION_SETTING); } private String getCurrentRegionCodePreN() { ContentResolver resolver = getContentResolver(); return Settings.System.getString(resolver, "user_country"); } }
2. 权限说明
API 23及以上无需额外申请权限,读取系统设置的相关键属于默认允许的操作;部分定制ROM可能存在差异,需实际测试验证。
三、适配注意事项
- 部分厂商定制系统可能修改了地区设置的存储键值,可通过ADB命令确认:
- API24+:
adb shell settings get secure region_setting - 低版本:
adb shell settings get system user_country
- API24+:
- 返回的地区代码均为两位大写字母,符合需求格式。
内容的提问来源于stack exchange,提问作者Sumit Shukla
相关产品推荐
相关产品推荐

