Android實現系統語言切換功能_Android

來源:互聯網
上載者:User

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

一、API欺騙

燒制到手機中的android.jar包含了Android所需的各種類與方法;而供開發人員使用的android.jar只是其中的一部分。API欺騙是指在應用中去類比未公開的類和方法讓應用編譯通過並產生APK,然而在應用實際運行中調用的卻仍是燒制到手機中真實的android.jar。

二、使用Java反射機制

IActivityManager與ActivityManagerNative都是非公開類,使用Java反射去調用其中的方法。
但是這個弊端是顯而易見的,上述兩種方法都是去更改系統的語言的類型,功能和你去設定頁面去設定語言類型的效果一樣。發現對當前系統設定了新的Locale後,不單自己的應用語系改變了,系統所有的應用語系都改變了,這正是我們所需要的。

核心代碼如下:

/** * TODO<更新系統語言> *  * @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);      // 此處需要聲明許可權:android.permission.CHANGE_CONFIGURATION      // 會重新調用 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的反射機制,調用那些隱藏的方法就可以實現了。

需要注意的是調用此方法:

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

需要加上許可權:

android.permission.CHANGE_CONFIGURATION

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

最後聲明:

既然是更改系統的配置當然你的簽名也應該是系統簽名和sharedUserId。不然會類似以下的錯誤!

error:

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

各位都注意下吧~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.