You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:19:55