a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 系統(tǒng) > Android > 正文

Android實現(xiàn)系統(tǒng)語言切換功能

2020-01-02 07:01:59
字體:
供稿:網(wǎng)友

簡單介紹下這個需求的緣由,這段時間因公司業(yè)務(wù)需要,其中有一項“設(shè)置系統(tǒng)語言”功能,就是在使用APP的過程中,動態(tài)的去切換整個Android機(jī)器的語言,具體參照手機(jī)設(shè)置頁面有語言切換功能。起初想來是很簡單的事情嘛,不就是個簡單的資源國際化嘛,strings.xml資源文件一整還不給OK?真正動起手來就真不是這么一回事了,國際化是沒問題,但是怎樣能更改所有頁面的文字資源呢,這是一個問題。下面介紹下網(wǎng)上找的幾個方案。

一、API欺騙

燒制到手機(jī)中的android.jar包含了Android所需的各種類與方法;而供開發(fā)者使用的android.jar只是其中的一部分。API欺騙是指在應(yīng)用中去模擬未公開的類和方法讓應(yīng)用編譯通過并生成APK,然而在應(yīng)用實際運(yùn)行中調(diào)用的卻仍是燒制到手機(jī)中真實的android.jar。

二、使用Java反射機(jī)制

IActivityManager與ActivityManagerNative都是非公開類,使用Java反射去調(diào)用其中的方法。
但是這個弊端是顯而易見的,上述兩種方法都是去更改系統(tǒng)的語言的類型,功能和你去設(shè)置頁面去設(shè)置語言類型的效果一樣。發(fā)現(xiàn)對當(dāng)前系統(tǒng)設(shè)置了新的Locale后,不單自己的應(yīng)用語系改變了,系統(tǒng)所有的應(yīng)用語系都改變了,這正是我們所需要的。

核心代碼如下:

/** * TODO<更新系統(tǒng)語言> *  * @author Xiho * @versionCode 1 <每次修改提交前+1> */@SuppressWarnings("unchecked")public class LanguageUtils {  public static void updateLanguage(Locale locale) {    try {      Object objIActMag, objActMagNative;      Class clzIActMag = Class.forName("android.app.IActivityManager");      Class clzActMagNative = Class          .forName("android.app.ActivityManagerNative");      //amn = ActivityManagerNative.getDefault();       Method mtdActMagNative$getDefault = clzActMagNative          .getDeclaredMethod("getDefault");      objIActMag = mtdActMagNative$getDefault.invoke(clzActMagNative);       // objIActMag = amn.getConfiguration();       Method mtdIActMag$getConfiguration = clzIActMag          .getDeclaredMethod("getConfiguration");      Configuration config = (Configuration) mtdIActMag$getConfiguration          .invoke(objIActMag);      // set the locale to the new value       config.locale = locale;      //持久化  config.userSetLocale = true;       Class clzConfig = Class          .forName("android.content.res.Configuration");      java.lang.reflect.Field userSetLocale = clzConfig          .getField("userSetLocale");      userSetLocale.set(config, true);      // 此處需要聲明權(quán)限:android.permission.CHANGE_CONFIGURATION      // 會重新調(diào)用 onCreate();      Class[] clzParams = { Configuration.class };      // objIActMag.updateConfiguration(config);      Method mtdIActMag$updateConfiguration = clzIActMag          .getDeclaredMethod("updateConfiguration", clzParams);      mtdIActMag$updateConfiguration.invoke(objIActMag, config);      BackupManager.dataChanged("com.android.providers.settings");    } catch (Exception e) {      e.printStackTrace();    }  }}

這樣我們利用JAVA的反射機(jī)制,調(diào)用那些隱藏的方法就可以實現(xiàn)了。

需要注意的是調(diào)用此方法:

// objIActMag.updateConfiguration(config);mtdIActMag$updateConfiguration.invoke(objIActMag, config);

需要加上權(quán)限:

android.permission.CHANGE_CONFIGURATION

并且此處會重新調(diào)用onCreate方法,我就在這個地方處被坑了一把。(如果調(diào)用此方法的時候做了一些邏輯,就注意下)。

最后聲明:

既然是更改系統(tǒng)的配置當(dāng)然你的簽名也應(yīng)該是系統(tǒng)簽名和sharedUserId。不然會類似以下的錯誤!

error:

java.lang.SecurityException: Permission Denial: updateConfiguration() from pid=31594, uid=10099 requires android.permission.CHANGE_CONFIGURATION

各位都注意下吧~

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩成人av在线播放 | 2020av视频| 高清av网址 | 欧美性猛交一区二区三区精品 | 日韩免费高清 | 国产精自产拍久久久久久 | 亚洲国产精品人人爽夜夜爽 | 亚洲一区| 日本成人中文字幕 | 成人二区| 久草免费在线 | 国产中文字幕在线 | 亚洲国产精品成人无久久精品 | av中文字幕在线播放 | www.日 | 亚洲高清在线观看视频 | 午夜精品久久久久久久星辰影院 | 国产激情在线视频 | 日本中文字幕一区 | 午夜视频在线观看网站 | 四虎网站在线观看 | 国产精品久久久久久一区二区三区 | 久久综合91| 国产精品永久在线观看 | 国产一二三四在线 | 精品一区二区三区四区五区 | 青娱乐av | 国产亚洲一区二区三区在线观看 | 日日夜夜精品网站 | 国产一区二区不卡 | 国产激情视频一区 | 久久一区二区视频 | 高清国产午夜精品久久久久久 | 四虎首页 | 亚洲视频在线观看免费 | 亚洲欧美另类国产 | 日韩成人影院 | 日韩成人一级片 | 日本一区中文字幕 | 99精品视频久久精品视频 | 国产在线一区观看 |