最近有需求需要去编程实现根据选择去修改系统语言, 根据查资料看setting源码有两种方式, 在这里记录一下. 修改系统语言或者控制系统开关机等操作即使声明了对应权限还是会报错, 这是因为这些操作需要系统权限,这里也会介绍如何使用android studio对应用进行系统签名.

一.如何查看系统的配置信息?

在终端使用adb shell getprop命令可以查看系统配置信息, 我们会得到类似下面的输出:

[persist.sys.language]: [en]
[persist.sys.localevar]: []
[persist.sys.operator]: [xxx]
[persist.sys.synctimetype]: [xxx]
[persist.sys.timezone]: [xxx]
[persist.sys.usb.config]: [xxx]
[ro.adb.secure]: [0]
[ro.allow.mock.location]: [0]
[ro.baseband]: [unknown]
[ro.board.platform]: [xxxxxxx]
[ro.boot.bootloader]: [xxxxxxxxx]

以ro开头的只能读取值,不能进行修改, 以 persist开头是保留值可以修改.
我们看到 persist.sys.language 的值标记了当前系统的语言.

那么如何去读取这个配置文件的信息呢?
在这里介绍两种方式:
(1)使用反射

    public static String getSystemProp(final String key, final String defaultValue) {try {if (getStringPropMethod == null) {getStringPropMethod = Class.forName("android.os.SystemProperties").getMethod("get", String.class, String.class);}return (String) getStringPropMethod.invoke(null, key, defaultValue);} catch (Exception e) {Log.e(TAG, Log.getStackTraceString(e));return defaultValue;}}

getSystemProp的第一个参数是属性文件的前面的字符串, 第二个参数为默认值, 例如如果想要获取系统当前语言:
getSystemProp(“persist.sys.language”, “zh”);

(2) 使用SystemProperties
SystemProperties 需要手动去引入它所依赖的jar包. 在 android studio中的配置步骤:
在工程的build.gradle中添加:
①在dependencies中添加引入函数:
dependencies {
……
provided files(getLayoutLibPath())
}
② 定义引入函数与引入的编码
tasks.withType(JavaCompile) {
options.encoding = “UTF-8”
}

def getLayoutLibPath() {
return “${android.getSdkDirectory().getAbsolutePath()}” + “/platforms/” + android.compileSdkVersion + “/data/layoutlib.jar”
}

配置成功后, 可以直接使用SystemProperties来获取系统配置文件中的信息.
获取系统语言:
SystemProperties.get(“persist.sys.language”, “zh”); //第二个参数为默认值

SystemProperties不但可以获取配置文件的信息, 而且可以去修改配置文件, 注意: 以ro开头的不能修改.
SystemProperties.set(“persist.sys.language”, “zh”); //将系统语言改成中文, 需要重启系统才能生效

如何不需要系统重启, 就能让改变语言生效?

(1) 网上提供的方式, 利用反射:

public static void setLanguage(Locale locale) {try {Object objIActMag;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 mtdIActMag$getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");Configuration config = (Configuration) mtdIActMag$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();}}

需要添加权限: android.permission.CHANGE_CONFIGURATION
这种方式会重新进入onCreate方法.

(2) 系统源码提供的方式:

    public void updateLocale(Locale locale) {try {IActivityManager am = ActivityManagerNative.getDefault();Configuration config = am.getConfiguration();config.locale = locale;am.updateConfiguration(config);BackupManager.dataChanged("com.android.providers.settings");} catch (RemoteException e) {}}

这时系统会提示找不到IActivityManager与ActivityManagerNative, 我们需要引入layoutlib包, 如何导入?请参考上面如何使用SystemProperties中的介绍, 导入layoutlib包. 同样此方法同样需要权限:android.permission.CHANGE_CONFIGURATION
重新编译一下, 这时就可以正常使用.

使用方法将系统语言改为英文:
Locale locale = Locale.US;
setLanguage(locale);

或者:
Locale locale = Locale.US;
updateLocale(locale);

这两种方式都可以改变系统语言, 大家可以任选一种.

二. android studio 为应用添加系统权限(添加系统签名)

1.在AndroidManifest.xml中的manifest节点下添加:

android:sharedUserId="android.uid.system"

2.生成签名文件
点击build–>generate Signed APK进入下图:

点击 Create new..按钮进入:

填写完相应信息, 点击确定, 点击next会在你选择的路径下生成demo.jks文件.
在这里假设路径为 /home/downloads/share/

3.集成系统签名需要的文件
(1) 让Android Studio集成系统签名,需要用到一个工具keytool-importkeypair 下载地址
将压缩包下载下来, 解压到jks文件所在的路径 /home/downloads/share/下.
(2) platform.x509.pem、platform.pk8
这两个文件位于系统源码中, 路径为../build/target/product/security. 我是将系统源码下载下来得到.
将这两个文件同样copy到jks文件所在的路径下. 此时 keytool-importkeypair, platform.x509.pem, platform.pk8和demo.jks在同一目录下

4.生成系统签名文件
在终端进入上面文件所在的目录, 运行下面命令:

./keytool-importkeypair -k demo.jks -p 123456 -pk8 platform.pk8 -cert platform.x509.pem -alias demo

命令说明: ./keytool-importkeypair -k [jks文件名] -p [jks的密码] -pk8 platform.pk8 -cert platform.x509.pem -alias [jks的别名]

运行完这条命令, 我们就得到系统签名文件了. 注意: 在window系统中是不能使用上面的命令, 也就是说不能使用keytool-importkeypair工具, 你需要将上面的keytool-importkeypair, platform.x509.pem, platform.pk8和demo.jks文件copy到linux系统下运行上面命令生成系统签名文件再将签名文件copy出来.

5.配置gradle(app)
添加signingConfigs配置, 填写jks的路径,密码,别名

还需要说一点, 生成的系统签名文件最好放到app的根目录下, 我这里在根目录下新建文件夹Signature, 将系统签名文件放到此目录下.

6.如果想直接Run app就是release版且带系统签名的apk,还需修改:
(1) 将app的编译模式改为release
(2) 修改buildTypes:

buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'signingConfig signingConfigs.release}
}

至此给应用系统签名介绍完毕. 如有问题欢迎留言.

android 如何修改系统语言相关推荐

  1. 自制服务器语言,修改系统语言,NTF服务器

    /*********修改系统语言,不需要重启**********/ public static void setLanguage(Locale locale) { try { Object objIA ...

  2. Centos修改系统语言

    使用man page帮助时,发现居然是中文的,不过想想即便英语再水,也要逼着自己去适应.于是百度找了一下修改系统语言的方法. 首先使用 locale 命令查看当前的系统语言 然后修改时一般有两种方法, ...

  3. Kali Linux 2020.1修改系统语言

    Kali Linux 2020.1修改系统语言 Kali Linux 2020.1安装后,可能显示的都是英文.为了方便使用,用户可以修改系统语言为中文.操作步骤如下所示: (1)以root用户登录系统 ...

  4. centos7修改系统语言为简体中文

    centos7修改系统语言为简体中文 说明 自己装系统时一般都可以自定义选择系统语言.可是云端服务器一般都是安装好的镜像,默认系统语言为英文,对于初学者可能还会有搞不懂的计算机词汇.这里简单说一下ce ...

  5. centos8修改系统语言为中文

    CentOS 8 设置中文语言包 安装中文支持 dnf install glibc-langpack-zh.x86_64 重启,在设置的"区域与语言"选项中,将语言改为中文. 如果 ...

  6. win7怎么修改系统语言

    win7怎么修改系统语言?点击电脑左下角的"开始",再点击"控制面板",点击"时间,语言和区域",点击"更改显示语言", ...

  7. Linux如何修改系统语言

    Linux如何修改系统语言 一.Linux如何修改系统语言 对于刚学Linux 的小伙伴,或者英语水平相对低一些的小伙伴,在自己的Linux系统里面如果能直接显示中文,中文提示就是比较爽的一件事了,接 ...

  8. linux7系统改成中文,centos7修改系统语言为简体中文

    centos7修改系统语言为简体中文和时区 说明 自己装系统时一般都可以自定义选择系统语言.可是云端服务器一般都是安装好的镜像,默认系统语言为英文,对于初学者可能还会有搞不懂的计算机词汇.这里简单说一 ...

  9. Android Studio依据系统语言修改app配置(如名字)

    1.如何配置 直接进入主题,我们在安装app时,如何依据当前设备的环境选择相应的app名以及app图标等. 比如系统语言为中文,需要app的名称为中文,那么需要如下操作: 在我们的项目的values同 ...

最新文章

  1. 空间里相片批量导入u盘_国民好物:aigo手机U盘 开启存储新时代
  2. 【Python基础】python使用python-docx操作word
  3. OpenCASCADE:形状愈合之根据指定标准分割形状的工具
  4. 模拟服务器MockServer之Moco详细介绍
  5. 排序——宇宙总统(洛谷 P1781)
  6. delphi语言转为汇编语言_计算机语言
  7. 构造函数创建私有变量(防继承)
  8. oracle数据库xsb创建,在Linux下安装oracle数据库
  9. Phone Bills【PAT 1016题】--- 电话账单结算
  10. 台电固态硬盘用什么测试软件,常规测试、实际使用测试与总结_固态硬盘评测-中关村在线...
  11. 【笔记】人工智能 一种现代方法 第1章 绪论
  12. hive+hbase学习手册
  13. 关于一些初级ACM竞赛题目的分析和题解(八)
  14. dorado关于下拉框的的onSelect()方法
  15. 产品经理|需求分析(附《需求池表格》下载)
  16. Windows Identity Foundation-- Windows身份验证基本框架
  17. [转]加盐hash保存密码的正确方式
  18. 问号在c语言里面的作用,问号的作用是什么-写作基础知识
  19. 还原扩容的缩水U盘真实容量方法(转载)
  20. 4D成像毫米波雷达按下“加速键”

热门文章

  1. arduinouno的地是相连的吗_稳定的阻燃材料效果好吗?
  2. 【Phalcon】升级版本
  3. 记忆单元属于计算机硬件系统吗,计算机基础-计算机硬件系统
  4. 【狮子数学】02极限与数列(函数)
  5. form表单中的enctype属性什么意思?
  6. 某大型互联网企业-Java工程师招聘
  7. stm32学习日记--重映射
  8. 《刘慈欣的思想实验室》笔记
  9. [原创]HP DV2 1005AU 装机偶得
  10. HDU 4741 Save Labman No.004(计算几何)