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.ENGLISHtry {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.hqwc.cn/news/228755.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高防CDN可以起到什么作用?

高防CDN相对于普通的CDN加速&#xff0c;除了具备基础的加速功效外&#xff0c;高防CDN在每一节点上均有相应配置的防御功效&#xff0c;不仅具备了隐藏源站不被攻击的优势&#xff0c;也具备了访问加速&#xff0c;多节点防御的功效。随着互联网的不断发展&#xff0c;网络上的…

第二十章——多线程

一.线程简介 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 二.创建线程 1.继承Thread类 1.Thread类是java.lang包中的一个类&#xff0c;从这个类实例化的对象代表线程&#xff0c;程序员启动一…

免交互语法expect

目录 前瞻 相关命令 范例一&#xff1a;免密登录另外一台主机并创建用户 范例二&#xff1a;免密登录另外三台主机并创建用户 前瞻 expect是建立在tcl&#xff08;tool command language&#xff09;语言基础上的一个工具&#xff0c;常被用于进行自动化控制和测试&#xf…

数据结构——链式二叉树的实现(详解)

呀哈喽。我是结衣。 不知道大家的递归学到怎么样呢&#xff1f;如果大家的递归功底不是很好&#xff0c;那么我相信在学完这篇文章后大家一定会对递归有一个更深层次的了解的。 构造链式二叉树 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能…

常见气体爆炸下限

国标中关于常见气体爆炸下限说明&#xff0c;特此记录 特此记录 anlog 2023年11月29日

java编程:数组代表着苹果期货在 9 天内的价格变化,其中第 n 个元素是苹果在第 n 天的 价格,你可以进行最多三次交易,设计算法,9 天内赚到最多的钱

1 题目 编程题&#xff1a;下面的数组代表着苹果期货在 9 天内的价格变化&#xff0c;其中第 n 个元素是苹果在第 n 天的 价格&#xff0c;你可以进行最多三次交易&#xff0c;设计一个算法&#xff0c;9 天内如何赚到最多的钱&#xff1f;价格数组&#xff1a; [8, 9, 2, 5, …

面试必须要知道的MySQL知识--索引

10 索引 10.1 数据页存储结构 10.1.1 数据页的各个部分 在讲索引之前&#xff0c;让我们看看一个单独的数据页是什么样子的 去除掉一些我们不太需要那么关注的部分后&#xff0c;简化如下&#xff1a; 也就是说平时我们在一个表里插入的一行一行的数据会存储在数据页里&#…

Blender学习笔记:小车狂奔动画

文章目录 路旁小树汽车尾气移动 教程地址&#xff1a;八个案例教程带你从0到1入门blender【已完结】 小车建模 路旁小树 1 添加摄像机&#xff0c;在小车下面拉一个平面&#xff0c;覆盖到摄像机的观察视窗。复制一层平面&#xff0c;收窄变成小车两侧的路面&#xff0c;编辑…

VAE模型及pytorch实现

VAE模型及pytorch实现 VAE模型推导部分最小化KL散度推导代码部分损失函数Encoder部分Decoder部分VAE整体架构 VAE问题参考资料 VAE&#xff08;变分自编码器&#xff09;是一种生成模型&#xff0c;结合了自编码器和概率图模型的思想。它通过学习数据的潜在分布&#xff0c;可以…

Python面试破解:return和yield的细腻差别

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python面试破解&#xff1a;return和yield的细腻差别&#xff0c;全文3000字&#xff0c;阅读大约10钟。 在Python的函数编程中&#xff0c;return和yield是两个常用的关键词…

居家适老化设计第三十四条---卫生间之照明

居家适老化卫生间照明设计需要考虑以下几个方面&#xff1a;1. 光源选择&#xff1a;选择适合老年人眼睛的柔和光源&#xff0c;避免刺眼和眩光的发生。可以选择LED灯具&#xff0c;因为它们具有节能、寿命长和可调光的特点。2. 光线布置&#xff1a;在不同区域设置不同的光线&…

Redis深入理解-主从架构下内核数据结构、主从同步以及主节点选举

Redis 主从挂载后的内核数据结构分析 主节点中&#xff0c;会通过 clusteNode 中的 slaves 来记录该主节点包含了哪些从节点&#xff0c;这个 slaves 是一个指向 *clusterNode[] 数组的数据结构从节点中&#xff0c;会通过 clusterNode 中的 slaveof 来记录该从节点属于哪个主…