Android 13+下如何获取未在app的resourceConfigurations中列出的系统区域设置
在Android 13+中绕过应用区域配置获取系统原生区域设置
在Android 13+的单应用区域设置机制下,若系统设置的区域未包含在应用的
resourceConfigurations列表中,即便用户未手动设置应用专属区域,Locale.getDefault()仍会返回resourceConfigurations内的区域,无法获取真实系统区域。同时不能移除resourceConfigurations,否则系统的单应用语言选择器无法正常显示应用支持的语言列表。尝试Resources.getSystem().getConfiguration()相关方法也无法得到预期结果。
核心方案:读取系统全局设置的区域信息
Android系统的Settings.Global中存储了原生的系统区域设置,通过读取该配置可以绕过应用自身的区域限制,直接获取系统真实区域,同时保留resourceConfigurations的配置,不影响系统语言选择器的正常显示。
代码实现
Kotlin版本
import android.content.Context import android.provider.Settings import java.util.Locale fun getSystemLocale(context: Context): Locale { // 读取系统全局区域设置,返回BCP 47格式字符串(如"zh-CN") val systemLocaleTag = Settings.Global.getString(context.contentResolver, Settings.Global.LOCALE_KEY) return systemLocaleTag?.takeIf { it.isNotEmpty() }?.let { Locale.forLanguageTag(it) } ?: Locale.getDefault() // 兜底处理异常情况 }
Java版本
import android.content.Context; import android.provider.Settings; import java.util.Locale; public class LocaleHelper { public static Locale getSystemLocale(Context context) { String systemLocaleTag = Settings.Global.getString(context.getContentResolver(), Settings.Global.LOCALE_KEY); if (systemLocaleTag != null && !systemLocaleTag.isEmpty()) { return Locale.forLanguageTag(systemLocaleTag); } return Locale.getDefault(); } }
说明
- 权限无需额外申请:
Settings.Global.LOCALE_KEY属于系统公开的全局设置,应用无需声明特殊权限即可读取。 - 不影响系统语言选择器:无需移除
build.gradle中的resourceConfigurations配置,系统单应用语言选择器仍会正常展示应用支持的语言列表。 - 兼容性:该方法适用于Android 13及以上版本,同时向下兼容低版本系统(低版本中
Settings.Global.LOCALE_KEY同样有效)。
内容的提问来源于stack exchange,提问作者Code Droid
相关产品推荐
相关产品推荐

