望远山,知近路,而后自得其乐!

Android 修改系统默认输入法

1. 修改系统默认输入法

Android系统的默认输入法在很多情况下是无法满足我们的需求的,因此就需要OEM自己集成输入法,基础输入法到系统,并需要修改系统默认输入法的配置。

  1. 在frameworks/base/packages/SettingsProvider/res/values/defaults.xml添加
<string name="def_input_method" translatable="false">com.android.inputmethod.pinyin/.PinyinIME</string>  
  1. frameworks/base/packages/SettingsProvider/src/com/Android/providers/settings/DatabaseHelper.java的loadSecureSettings函数中添加
loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD, R.string.def_input_method);
  1. 如使用第三方自定义输入法,请将输入法放到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命令设置默认输入法

  1. 显示系统安装的输入法列表
    adb shell ime list -s
  2. 获取系统默认输入法
    adb shell settings get secure default_input_method
  3. 设置系统默认输入法
    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的处理。

  1. 在frameworks/base/packages/SettingsProvider/res/values/defaults.xml添加:

    <string name="def_enabled_input_methods" translatable="false">com.android.inputmethod.pinyin/.PinyinIME</string> 
  2. 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的值会包含多个输入法,以:分割。

文章评论已关闭!