1.因为此功能涉及到系统权限.
2.需要获取系统权限
3.利用反射机制来设置系统语言,此种方式需要重启系统生效.
一.因为此功能涉及到系统权限.
需要配置
android:sharedUserId="android.uid.system"
也需要获取系统权限
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
二.反射机制的代码
public static void setLanguage(Context mContext,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();
}
//系统重启
startReboot(mContext);
}
//重启系统逻辑
public static void startReboot(Context mContext){
Intent intent = new Intent(Intent.ACTION_REBOOT);
intent.putExtra("nowait", 1);
intent.putExtra("interval", 1);
intent.putExtra("window", 0);
mContext.sendBroadcast(intent);
}
三> 完毕.
本文详细介绍了一种通过反射机制动态设置系统语言的方法,并提供了具体的代码实现。此方法需配置特定权限并调用系统API更新配置,最后通过广播触发系统重启以使更改生效。
868

被折叠的 条评论
为什么被折叠?



