我需要从我的应用程序(安装为系统应用程序)更改操作系统的语言,我使用反射来访问这些类
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));
}
}
我的问题是ActivityManagerNative
,Locale.locale
和ActivityManagerNative.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
答案 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);
}
}