Android 9.0 切换系统语言
网络上的方法,应用反射的方法进行系统设置
权限,需要修改系统配置文件的权限,需要系统权限
<!-- 切换语言,修改配置文件 --><uses-permission android:name="android.permission.CHANGE_CONFIGURATION"tools:ignore="ProtectedPermissions" />
private void setLanguage(Locale setLocaleLanguage) {Log.d("zwt","设置语言");try {Class classActivityManagerNative = Class.forName("android.app.ActivityManagerNative");Method getDefault = classActivityManagerNative.getDeclaredMethod("getDefault");Object objIActivityManager = getDefault.invoke(classActivityManagerNative);Class classIActivityManager = Class.forName("android.app.IActivityManager");Method getConfiguration = classIActivityManager.getDeclaredMethod("getConfiguration");Configuration config = (Configuration)getConfiguration.invoke(objIActivityManager);config.setLocale(setLocaleLanguage);Class clzConfig = Class.forName("android.content.res.Configuration");Field userSetLocale = clzConfig.getField("userSetLocale");userSetLocale.set(config, true);Class[] clzParams = new Class[]{Configuration.class};Method updateConfiguration = classIActivityManager.getDeclaredMethod("updateConfiguration", clzParams);updateConfiguration.invoke(objIActivityManager, config);BackupManager.dataChanged("com.android.providers.settings");} catch (Exception var12) {Log.d("zwt", "setLanguage: " + var12.getLocalizedMessage());}}
调用
setLanguage(Locale.ENGLISH);//英语//Locale 类中有些语言没有,可以用下面的方法进行设置,只要系统支持这种语言就能设置成功
Locale portuguese = new Locale("pt");
setLanguage(portuguese); //葡萄牙语
上面是用的反射的方法,发现在原生的设置里面有些功能会闪退,例如切换语言后,设置时区设置会闪退,跟踪log发现是下面的local.getCountry(); 获得国家的方法获得为空,导致zoneIds 这个List 获得为空,爆出空指针的错误
解决办法,发现系统中有封装好的修改语言的方法,不过是对非系统应用隐藏了,com.android.internal.app.LocalePicker 这个类对非系统用户隐藏了
import android.content.Context;
import android.content.res.Resources;
import android.os.Handler;
import android.util.Log;
import android.view.View;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;import com.android.internal.app.LocalePicker;private final Map<String, LocalePicker.LocaleInfo> mLocaleInfoMap = new HashMap<String, LocalePicker.LocaleInfo>();private Locale mNewLocale;@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获得系统支持的所有语言信息final List<LocalePicker.LocaleInfo> localeInfoList = LocalePicker.getAllAssetLocales(SystemActivity.this, false);for (final LocalePicker.LocaleInfo localeInfo : localeInfoList) {final String languageTag = localeInfo.getLocale().toLanguageTag();mLocaleInfoMap.put(languageTag, localeInfo);Log.d("zwt", "::::"+languageTag);}}// 设置系统默认语言private void setLanguage(String languageTag) {mNewLocale = mLocaleInfoMap.get(languageTag).getLocale();mDelayHandler.removeCallbacks(mSetLanguageRunnable);mDelayHandler.postDelayed(mSetLanguageRunnable, 500);}private final Handler mDelayHandler = new Handler();private final Runnable mSetLanguageRunnable = new Runnable() {@Overridepublic void run() {LocalePicker.updateLocale(mNewLocale);}};
最主要的是 LocalePicker.updateLocale(mNewLocale); 去设置系统的配置文件,修改系统语言
调用
//设置简体中文
setLanguage("zh-CN");
至于传入的字符串的值,可以看上面 onCreate 中的 languageTag log打印
最后成功解决
Android 9.0 切换系统语言相关推荐
- android改变系统语言,Android 9.0设置系统语言
1.系统权限 android:sharedUserId="android.uid.system" 2.签名 通过手动签名的方式,用系统的签名文件为程序签名解决签名的问题,将程序加入 ...
- Android 9.0设置系统语言
1.系统权限 android:sharedUserId="android.uid.system" 2.签名 通过手动签名的方式,用系统的签名文件为程序签名解决签名的问题,将程序加入 ...
- android7.0输入法切换,7.0 Android系统修改默认输入法后,切换系统语言时输入法自动切到AOSP的解决办法...
Android 7.0设置默认输入法参考下面的文章 Android修改默认输入法 切换系统语言之后,系统会默认将输入法切换到Andorid Keyboard(AOSP) /frameworks/bas ...
- Android 9.0 代码切换系统语言
最近有个功能要求切换系统语言,通过查询资料找到用反射的方法进行系统设置,但是感觉实现方式太麻烦了,后来看源码发现 LocalePicker 这个类里面有 updateLocale 方法能够轻松完成系统 ...
- Android 系统(225)---Android 7.0切换阿拉伯语,QuickSetting界面图标左右翻转
Android 7.0切换阿拉伯语,QuickSetting界面图标左右翻转. 切换手机语言为阿拉伯语,下拉状态栏到Quicksetting界面,快捷图标左右翻转.如下图 如果不想要这个左右翻转效果, ...
- android 语音和输入法按钮切换,android 切换系统语言,输入法也随之切换
为什么有时候切换系统语言,输入法也随之切换 在系统有谷歌拼音输入法(Pinying输入法)和android 键盘输入法(Latin 输入法)的时候,此时系统的输入法不是第三方输入法. 在这时候去切换系 ...
- Android 获取当前系统语言和切换系统语言
最近有需求需要切换系统语言的功能,查阅api最终搞定,代码分享如下: 1.切换语言 public void updateLanguage(Locale locale) {try {Object obj ...
- Android 切换系统语言
切换系统语言分为下面两个步骤: 1. 创建不同语言资源: 2. 替换当前页面 Context 所持有的资源: 一.创建不同语言资源 创建步骤如下: 二.替换资源 界面需要重新创建,使用 recreat ...
- 谈谈Android切换系统语言导致Activity的重启
一:网上能搜到的解决方法: 方法:在AndroidManifest.xml中Activity节点中配置android:configChanges="locale|layoutDirectio ...
最新文章
- Safari、IE浏览器出现允许改写地址栏的漏洞
- repmgr 4.3 发布,PostgreSQL 复制与故障转移管理工具
- 关于智能车竞赛程序公正问题的讨论
- react子组件向父组件传递数据实例
- ODPS技术架构及应用实践
- Python 操作 MongoDB
- 【2017年第1期】基于征信数据观中国近10年产业间信贷资源的调整路径
- 解决方案/DIV+CSS 在 IE7/IE6/Firefox间的兼容性问题
- 【小白问题】appendTo()
- VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置
- windows powershell 没有vi_「PowerShell」人人都值得学一点PowerShell实现自动化(2)
- 二十九 Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求...
- 吟诗作赋不能赚钱,作诗的AI机器人的盈利之路在哪
- 清除Chrome的缓存、Cookie
- pgsql装数卸数方案
- android手机怎么取电池,荣耀V8后盖怎么打开 华为荣耀V8手机后盖拆解与更换电池图文教程...
- 第14节:lstm原理及numpy
- 纯CSS3实现常见的时间进度线(竖立方向)
- 如何在spring事务提交成功后再进行异步操作
- GHOSTXP_SP3电脑公司特别版V2012_05