需求背景:

由于公司出于商业的要求,需要输入法进行切换,但是输入法是已经配置好的,并且已经写入了用户数据库中,但是通过FOTA 又无法更改客户的数据,于是想到了如下方法:

配置文件修改:

base/packages/SettingsProvider/res/values/defaults.xml
修改默认输入法的配置:

<string name="config_default_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME</string>
<string name="config_enabled_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME:com.android.inputmethod.latin/.LatinIME</string>

代码修改如下:

base/services/core/java/com/android/server/InputMethodManagerService.java

private void switchUserLocked(int newUserId) { 
添加如下代码:
final String defaultImiId = mSettings.getSelectedInputMethod();
if (!TextUtils.isEmpty(defaultImiId)) {
if (!map.containsKey(defaultImiId)) {
Slog.w(TAG, "Default IME is uninstalled. Choose new default IME.");
**/* modify begin */**
/* reset default ime if previous default ime uninstalled */
try {
final String pkgProvider = "com.android.providers.settings";
Resources res = mContext.createPackageContext(pkgProvider, 0).getResources();
int resImeId = res.getIdentifier("def_input_method", "string", pkgProvider);
String defImeId = res.getString(resImeId);
mSettings.putSelectedInputMethod(defImeId);
setInputMethodEnabledLocked(defImeId, true);
Slog.w(TAG, "Reset default IME to: " + defImeId);
} catch (Exception e) {
Slog.w(TAG, "Failed to reset default ime", e);
if (chooseNewDefaultIMELocked()) {
updateInputMethodsFromSettingsLocked(true);
}
}
**/* modify end */**
} else {
// Double check that the default IME is certainly enabled.
setInputMethodEnabledLocked(defaultImiId, true);
}
}