我需要在安装为Android系统应用程序的应用程序中更改系统语言

时间:2018-02-15 09:39:22

标签: android android-8.0-oreo

我需要从我的应用程序(安装为系统应用程序)更改操作系统的语言,我使用反射来访问这些类

        public void setSystemLanguage (String langCode)
        {
            Locale loc;
            loc = Locale.forLanguageTag(langCode);
            try {
                Class<?> activityManagerNative = Class.forName("android.app.ActivityManagerNative");
                Object am = activityManagerNative.getMethod("getDefault", new Class[0]).invoke(activityManagerNative, new Object[0]);
                Object config = am.getClass().getMethod("getConfiguration", new Class[0]).invoke(am, new Object[0]);
                config.getClass().getDeclaredField("locale").set(config, loc);
                config.getClass().getDeclaredField("userSetLocale").setBoolean(config, true);
                am.getClass().getMethod("updateConfiguration", new Class[]{Configuration.class}).invoke(am, new Object[]{config});
            } catch (Exception e) {
                Log.e(LOG_TAG, Log.getStackTraceString(e));
            }
        }

我的问题是ActivityManagerNativeLocale.localeActivityManagerNative.updateConfiguration()已被弃用。 我尝试了以下代码

  Object objIActMag, objActMagNative;
        Class clzIActMag = Class.forName("android.app.IActivityManager");
        Class clzActMagNative = Class.forName("android.app.ActivityManager");
        Method getDefault = clzActMagNative.getDeclaredMethod("getService");
        objIActMag = getDefault.invoke(clzActMagNative);
        Method getConfiguration = clzIActMag.getDeclaredMethod("getConfiguration");
        Configuration config = (Configuration) getConfiguration.invoke(objIActMag);
        LocaleList localeList = new LocaleList(locale);
        config.setLocale(localeList.get(0));
        config.getClass().getDeclaredField("locale").set(config, locale);
        config.getClass().getDeclaredField("userSetLocale").setBoolean(config, true);

        Class[] clzParams = { Configuration.class };
        Method updateConfiguration = clzIActMag.getDeclaredMethod(
                "updateConfiguration", clzParams);
        updateConfiguration.invoke(clzIActMag,config);
        BackupManager.dataChanged("com.android.providers.settings");

我的问题是我找不到已弃用的方法updateConfiguration()的替代品。我找到了替代此方法

Configuration overrideConfiguration = getBaseContext().getResources().getConfiguration();
overrideConfiguration.setLocales(LocaleList);
Context context  = createConfigurationContext(overrideConfiguration);
Resources resources = context.getResources();

但我不确定如何使用此处的上下文,因为我需要更改SYSTEM语言。请注意,这不是用于更改应用程序语言。

从LocalePicker.java更改System中Locale的代码是

  public static void updateLocales(LocaleList locales) {
    try {
        final IActivityManager am = ActivityManager.getService();
        final Configuration config = am.getConfiguration();
        config.setLocales(locales);
        config.userSetLocale = true;

        am.updatePersistentConfiguration(config);        
        BackupManager.dataChanged("com.android.providers.settings");
    } catch (RemoteException e) {          
    }
}

请找到已弃用的方法updateConfiguration()的替代品,以便我可以将更改应用到SYSTEM

3 个答案:

答案 0 :(得分:2)

我找到了另一种没有反思的方法来实现它。 请理解这仅适用于系统应用程序以及在OS级别工作的人员。

import android.app.Activity;
import android.app.ActivityManager;
import android.app.IActivityManager;

更改语言的方法。必须是系统应用程序。 与

android:sharedUserId="android.uid.system" 
清单中的

 public void changeLanguageSettings(Locale language/*Locale.GERMAN*/) {
        try {
            IActivityManager am = ActivityManager.getService();
            Configuration config = am.getConfiguration();
            config.setLocale(language);
            config.userSetLocale = true;
            am.updatePersistentConfiguration(config);
            BackupManager.dataChanged("com.android.providers.settings");

            Log.d("changelanguage", "success!");
        } catch (Exception e) {
            Log.d("changelanguage", "error-->", e);
        }
    }

答案 1 :(得分:0)

虽然我没有找到使用代码更改设备语言的直接方法, 您可以使用Intent而不是执行上述所有实现。

startActivity(new Intent(android.provider.Settings.ACTION_LOCALE_SETTINGS));

这将显示语言列表,您可以按照这种方式进行更改。

答案 2 :(得分:0)

最后我自己找到了。发布给别人,让他们不想陷入混乱。

    public void changeLanguageSettings(Context con, Locale language/*Locale.GERMAN*/) {
    try {

        Class<?> activityManagerNative = Class.forName("android.app.ActivityManager");
        Object am = activityManagerNative.getMethod("getService").invoke(activityManagerNative);
        Configuration config = (Configuration) am.getClass().getMethod("getConfiguration").invoke(am);

        config.setLocale(language);
        config.getClass().getDeclaredField("userSetLocale").setBoolean(config, true);
        am.getClass().getMethod("updatePersistentConfiguration", android.content.res.Configuration.class).invoke(am, config);
        BackupManager.dataChanged("com.android.providers.settings");

        Log.d("changelanguage", "success!");

    catch (Exception e) {
        Log.d("changelanguage", "error-->", e);
    }
}