【Android】切换系统全局语言设置

前两种为应用内部处理,第三种为发送广播由系统服务进行处理

使用反射

这种会直接将安卓设置内的语言列表清空,然后将选择的语言设置为系统语言

该方法存在问题,在首次开机后设置会导致国外应用进不去(只对于here地图个别版本)

java 复制代码
    /**
     * 设置语言,使用反射
     * @param mLocale CHINESE ENGLISH
     */
    public void setLanguage(Locale mLocale) {
        try {
            Class localPicker = Class.forName("com.android.internal.app.LocalePicker");
            Method updateLocale = localPicker.getDeclaredMethod("updateLocale",
                    Locale.class);
            updateLocale.invoke(null,mLocale);
        } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException
                | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

更新语言列表方式

参考安卓设置方法进行移植,该方法需要系统的framework的jar包支持

java 复制代码
/*
** 获取系统语言列表,并将选择的语言加入进去
*/
private List<LocaleStore.LocaleInfo> getUserLocaleList(Context context) {
    final List<LocaleStore.LocaleInfo> result = new ArrayList<>();

    final LocaleList localeList = LocalePicker.getLocales();
    for (int i = 0; i < localeList.size(); i++) {
        //判断列表中是否有重复项,如有,略过
        Locale locale = localeList.get(i);
        if (locale.getLanguage().equals("en")) {
            continue;
        }
        result.add(LocaleStore.getLocaleInfo(locale));
    }
    Locale mLocale = new Locale("en","EN");
    result.add(0,LocaleStore.getLocaleInfo(Locale.ENGLISH));

    return result;
}

调用

java 复制代码
List<LocaleStore.LocaleInfo> mFeedItemList = getUserLocaleList(getApplicationContext());
int count = mFeedItemList.size();
Locale[] newList = new Locale[count];
for (int i = 0; i < count; i++) {
    final LocaleStore.LocaleInfo li = mFeedItemList.get(i);
    newList[i] = li.getLocale();
}
LocaleList ll = new LocaleList(newList);
LocaleList.setDefault(ll);
LocalePicker.updateLocales(ll);

系统服务进行处理

  • 参考系统恢复默认设置处理

系统/安卓设置内流程

流程未研究,待定

该条目参考文章:Android Settings(设置)语言的切换和添加原理流程简析

相关推荐
消失的旧时光-19432 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs3 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&3 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
LDORntKQH3 小时前
基于深度强化学习的混合动力汽车能量管理策略 1.利用DQN算法控制电池和发动机发电机组的功率分配 2
android
冬奇Lab3 小时前
Android 15 ServiceManager与Binder服务注册深度解析
android·源码·源码阅读
2501_916008895 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
独行soc6 小时前
2026年渗透测试面试题总结-20(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
常利兵6 小时前
2026年,Android开发已死?不,它正迎来黄金时代!
android
Risehuxyc7 小时前
备份三个PHP程序
android·开发语言·php
Doro再努力16 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim