Android 5.1システムのデフォルト言語の変更
2495 ワード
このとても2の問題を振り回しました.ネットで流す方法は古い、Android 5.1の場合、設定後はその時点で有効になり、再起動後は無効になります.
違う場所が追加されました
Debugが発見した論理は:1:持続化保存
2:Android Runtimeを起動してこの属性を読み取り、システムの前の属性を更新します.
ランニングテストのCaseを容易にするために追加されたこのロジックと推定される.
private void updateLanguage(Locale locale) {
try {
Object objIActMag, objActMagNative;
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);
// :android.permission.CHANGE_CONFIGURATION
// onCreate();
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();
}
}
違う場所が追加されました
Class clzConfig = Class.forName("android.content.res.Configuration");
java.lang.reflect.Field userSetLocale = clzConfig.getField("userSetLocale");
userSetLocale.set(config, true);
Debugが発見した論理は:1:持続化保存
SystemProperties.set("persist.sys.language", l.getLanguage());
SystemProperties.set("persist.sys.country", l.getCountry());
2:Android Runtimeを起動してこの属性を読み取り、システムの前の属性を更新します.
ランニングテストのCaseを容易にするために追加されたこのロジックと推定される.