1. 修改系统默认输入法
Android系统的默认输入法在很多情况下是无法满足我们的需求的,因此就需要OEM自己集成输入法,基础输入法到系统,并需要修改系统默认输入法的配置。
- 在frameworks/base/packages/SettingsProvider/res/values/defaults.xml添加
<string name="def_input_method" translatable="false">com.android.inputmethod.pinyin/.PinyinIME</string>
- frameworks/base/packages/SettingsProvider/src/com/Android/providers/settings/DatabaseHelper.java的loadSecureSettings函数中添加
loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD, R.string.def_input_method);
- 如使用第三方自定义输入法,请将输入法放到system/app目录打包到系统。
附:常见输入法的包名和类名
输入法 | 包名/类名 |
---|---|
百度 | com.baidu.input/.ImeService |
讯飞 | com.iflytek.inputmethod/.FlyIME |
腾讯 | com.tencent.qqpinyin/.QQPYInputMethodService |
谷歌 | com.google.android.inputmethod.pinyin/.PinyinIME |
搜狗 | com.sohu.inputmethod.sogou/.SogouIME |
触宝 | com.cootek.smartinput5/.TouchPalIME |
2. 使用ADB命令设置默认输入法
- 显示系统安装的输入法列表
adb shell ime list -s
- 获取系统默认输入法
adb shell settings get secure default_input_method
- 设置系统默认输入法
adb shell settings put secure default_input_method com.sohu.inputmethod.sogou/.SogouIME
3. 使用代码设置系统默认输入法
public class InputMethodUtil {
/**
* get system default input method
* @param context
* @return
*/
public static String getDefaultInputMethod(Context context) {
return Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.DEFAULT_INPUT_METHOD);
}
/**
* Set system default input method
* @param context
* @param inputMethod: input method
* @return
*/
public static boolean setDefaultInputMethod(Context context, String inputMethod) {
return Settings.Secure.putString(context.getContentResolver(),
Settings.Secure.DEFAULT_INPUT_METHOD,
inputMethod);
}
/**
* Gets the input method that the system has installed
*
* @param context
* @return installed input method list
*/
public static String[] getInputMethodIdList(Context context) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null && imm.getInputMethodList() != null) {
String[] methodIds = new String[imm.getInputMethodList().size()];
for (int i = 0; i < imm.getInputMethodList().size(); i++) {
methodIds[i] = imm.getInputMethodList().get(i).getId();
}
return methodIds;
}
return new String[] {};
}
/**
* update system input method with checking
* @param context
* @param inputMethod
* @return
*/
public static boolean updateDefaultInputMethod(Context context, String inputMethod) {
if (context != null && !TextUtils.isEmpty(inputMethod)) {
String current = getDefaultInputMethod(context);
if (current != null && !current.equalsIgnoreCase(inputMethod)) {
String packageName = inputMethod.substring(0, inputMethod.indexOf('/'));
android.content.pm.ApplicationInfo info = null;
try {
info = context.getPackageManager().getApplicationInfo(packageName, 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
if (info != null) {
return setDefaultInputMethod(context, inputMethod);
}
}
}
return false;
}
}
4. Android 9.0修改默认输入法
上的修改方式在Android4.4上验证是没有问题的,在Android9.0版本上,还需要增加ENABLED_INPUT_METHODS
的处理。
在frameworks/base/packages/SettingsProvider/res/values/defaults.xml添加:
<string name="def_enabled_input_methods" translatable="false">com.android.inputmethod.pinyin/.PinyinIME</string>
frameworks/base/packages/SettingsProvider/src/com/Android/providers/settings/DatabaseHelper.java的loadSecureSettings函数中添加
loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS, R.string.def_enabled_input_methods);
使用代码设置时,还需要设置Settings.Secure.DEFAULT_INPUT_METHOD
的值,Settings.Secure.DEFAULT_INPUT_METHOD
的值会包含多个输入法,以:
分割。