网络上的方法,应用反射的方法进行系统设置
权限,需要修改系统配置文件的权限,需要系统权限

 <!-- 切换语言,修改配置文件 --><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 切换系统语言相关推荐

  1. android改变系统语言,Android 9.0设置系统语言

    1.系统权限 android:sharedUserId="android.uid.system" 2.签名 通过手动签名的方式,用系统的签名文件为程序签名解决签名的问题,将程序加入 ...

  2. Android 9.0设置系统语言

    1.系统权限 android:sharedUserId="android.uid.system" 2.签名 通过手动签名的方式,用系统的签名文件为程序签名解决签名的问题,将程序加入 ...

  3. android7.0输入法切换,7.0 Android系统修改默认输入法后,切换系统语言时输入法自动切到AOSP的解决办法...

    Android 7.0设置默认输入法参考下面的文章 Android修改默认输入法 切换系统语言之后,系统会默认将输入法切换到Andorid Keyboard(AOSP) /frameworks/bas ...

  4. Android 9.0 代码切换系统语言

    最近有个功能要求切换系统语言,通过查询资料找到用反射的方法进行系统设置,但是感觉实现方式太麻烦了,后来看源码发现 LocalePicker 这个类里面有 updateLocale 方法能够轻松完成系统 ...

  5. Android 系统(225)---Android 7.0切换阿拉伯语,QuickSetting界面图标左右翻转

    Android 7.0切换阿拉伯语,QuickSetting界面图标左右翻转. 切换手机语言为阿拉伯语,下拉状态栏到Quicksetting界面,快捷图标左右翻转.如下图 如果不想要这个左右翻转效果, ...

  6. android 语音和输入法按钮切换,android 切换系统语言,输入法也随之切换

    为什么有时候切换系统语言,输入法也随之切换 在系统有谷歌拼音输入法(Pinying输入法)和android 键盘输入法(Latin 输入法)的时候,此时系统的输入法不是第三方输入法. 在这时候去切换系 ...

  7. Android 获取当前系统语言和切换系统语言

    最近有需求需要切换系统语言的功能,查阅api最终搞定,代码分享如下: 1.切换语言 public void updateLanguage(Locale locale) {try {Object obj ...

  8. Android 切换系统语言

    切换系统语言分为下面两个步骤: 1. 创建不同语言资源: 2. 替换当前页面 Context 所持有的资源: 一.创建不同语言资源 创建步骤如下: 二.替换资源 界面需要重新创建,使用 recreat ...

  9. 谈谈Android切换系统语言导致Activity的重启

    一:网上能搜到的解决方法: 方法:在AndroidManifest.xml中Activity节点中配置android:configChanges="locale|layoutDirectio ...

最新文章

  1. Safari、IE浏览器出现允许改写地址栏的漏洞
  2. repmgr 4.3 发布,PostgreSQL 复制与故障转移管理工具
  3. 关于智能车竞赛程序公正问题的讨论
  4. react子组件向父组件传递数据实例
  5. ODPS技术架构及应用实践
  6. Python 操作 MongoDB
  7. 【2017年第1期】基于征信数据观中国近10年产业间信贷资源的调整路径
  8. 解决方案/DIV+CSS 在 IE7/IE6/Firefox间的兼容性问题
  9. 【小白问题】appendTo()
  10. VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置
  11. windows powershell 没有vi_「PowerShell」人人都值得学一点PowerShell实现自动化(2)
  12. 二十九 Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求...
  13. 吟诗作赋不能赚钱,作诗的AI机器人的盈利之路在哪
  14. 清除Chrome的缓存、Cookie
  15. pgsql装数卸数方案
  16. android手机怎么取电池,荣耀V8后盖怎么打开 华为荣耀V8手机后盖拆解与更换电池图文教程...
  17. 第14节:lstm原理及numpy
  18. 纯CSS3实现常见的时间进度线(竖立方向)
  19. 如何在spring事务提交成功后再进行异步操作
  20. GHOSTXP_SP3电脑公司特别版V2012_05

热门文章

  1. 程序员如何实现财富自由
  2. Make my mind tobe a coder! Wa kakak
  3. kewail邮件短信平台
  4. 2022-2028全球及中国全耗尽绝缘体上硅(FD-SOI)行业研究调查分析报告
  5. 用fdisk命令检查分区和SD/USB设备信息
  6. Laravel 上传文件大小改为200M
  7. 针对大众点评网上商铺评论字体替换反爬的反反爬
  8. 高中数学必修3知识点总结归纳:第一章算法初步
  9. 类设计者的工具(四):面向对象程序设计 (继承)
  10. 15 个国外免费卫星图像数据源介绍