当前位置: 首页 > article >正文

android13(T) 客制化预置语言列表

效果图

piBbEC9.png

需求分析

这个列表界面一般都是后来手动添加后才现实的,通过分析源码发现通过如下值可控

adb shell settings get system system_locales

zh-CN,ja-JP,en-AT

所以只需查询出这个值,然后加在 SettingProvider 中即可

隐藏 bug

如果客户要求默认语言为 en-AT,且客制列表顺序如上显示,通过之前惯用设置语言反射接口设置后,

有bug版本接口 使用 updateConfiguration

 public void changeSystemLanguage(Locale locale) {//Locale.ENGLISH
        try {
            Object objIActMag, objActMagNative;

            Class clzIActMag = Class.forName("android.app.IActivityManager");
            Class clzActMagNative = Class.forName("android.app.ActivityManagerNative");
            Method mtdActMagNative$getDefault = clzActMagNative.getDeclaredMethod("getDefault");
            objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);
            Method getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");

            Configuration config = (Configuration) getConfiguration.invoke(objIActMag);
            config.locale = locale;

            Class clzConfig = Class.forName("android.content.res.Configuration");
            java.lang.reflect.Field userSetLocale = clzConfig.getField("userSetLocale");
            userSetLocale.set(config, true);

            Class[] clzParams = {Configuration.class};
            Method mtdIActMag$updateConfiguration = clzIActMag.getDeclaredMethod("updateConfiguration", clzParams);
            mtdIActMag$updateConfiguration.invoke(objIActMag, config);
            BackupManager.dataChanged("com.android.providers.settings");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

首次开机预置语言列表将不显示,重启一次后才会正确显示。经过分析是设置语言接口的锅,

替换新方法即可解决

正常版本接口 使用 updatePersistentConfiguration

private LocaleList makeLocalListData(Context mContext, String locale) {
//        String defaultConfig = "zh-CN,ja-JP,en-AT";
        String defaultConfig = Settings.System.getString(mContext.getContentResolver(),"system_locales");
        String[] split = defaultConfig.split(",");
        int index=0;
        String newConfig = "";
        for (int i = 0; i < split.length; i++) {
            if (split[i].contains(locale)) {
                index = i;
                newConfig = split[i];
                break;
            }
        }

        for (int i = 0; i < split.length; i++) {
            if (i == index) {
                continue;
            }
            newConfig = newConfig.concat(","+split[i]);
        }

        return LocaleList.forLanguageTags(newConfig);
    }

    public void changeSystemLocales(Context mContext, String locale) {
        try {
            LocaleList localeList = makeLocalListData(mContext, locale);
            Class iActivityManager = Class.forName("android.app.IActivityManager");
            Class activityManagerNative = Class.forName("android.app.ActivityManagerNative");
            Method getDefault = activityManagerNative.getDeclaredMethod("getDefault");
            Object objIActMag = getDefault.invoke(activityManagerNative);
            Method getConfiguration = iActivityManager.getDeclaredMethod("getConfiguration");
            Configuration config = (Configuration) getConfiguration.invoke(objIActMag);
            config.setLocales(localeList);
            Class clzConfig = Class.forName("android.content.res.Configuration");
            java.lang.reflect.Field userSetLocale = clzConfig.getField("userSetLocale");
            userSetLocale.set(config, true);
            Class[] clzParams = {Configuration.class};
            Method updateConfiguration = iActivityManager.getDeclaredMethod("updatePersistentConfiguration", clzParams);
            updateConfiguration.invoke(objIActMag, config);
            BackupManager.dataChanged("com.android.providers.settings");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

http://www.kler.cn/a/156659.html

相关文章:

  • web安全测试渗透案例知识点总结(上)——小白入狱
  • 初级数据结构——栈
  • Git在版本控制中的应用
  • Python——NumPy库的简单用法,超级详细教程使用
  • 大模型时代,呼叫中心部门如何自建一套大模型在线客服?
  • 建筑施工特种作业人员安全生产知识试题
  • XunSearch 讯搜 error: storage size of ‘methods_bufferevent’ isn’t known
  • 软考初级、中级、高级怎么选?
  • 04-数据库操作对象Statement对象和PreparedStatement对象的区别,SQL注入的优缺点
  • yolov5实现多图形识别和图像训练
  • 多线程详解1-互斥锁,读写锁,生产者消费者模型
  • docker 如何在容器内重启 php
  • 数据管理系统-week9-事务处理程序简介
  • ADAudit Plus:强大的网络安全卫士
  • RflySim | 姿态控制器设计实验一
  • 接口测试--知识问答
  • CCFCSP试题编号:202006-2试题名称:稀疏向量
  • 科普类软文怎么写才能提高用户接受度?媒介盒子分享
  • 拼多多关键词搜索商品列表接口调用演示,关键词搜索接口,item_search - 按关键字搜索商品列表案例
  • 在线陪诊系统: 医疗科技的崭新前沿
  • MacOS 14 系统 XCode15、 Flutter 开发 IOS
  • QJsonObject 是 Qt 框架中用于表示 JSON 对象的类
  • opencv知识库:cv2.add()函数和“+”号运算符
  • 计算机网络TCP篇③问答篇
  • 【NGINX--11】利用访问日志、错误日志和 请求跟踪进行调试和故障排除
  • Python与ArcGIS系列(十四)批量输出shp(自定义工具)