Android 5.1システムのデフォルト言語の変更

2495 ワード

このとても2の問題を振り回しました.ネットで流す方法は古い、Android 5.1の場合、設定後はその時点で有効になり、再起動後は無効になります.
        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を容易にするために追加されたこのロジックと推定される.