[

 

如何修改默认输入法?

[Solution]
一、适用于ICS(Android V4.0)之前的版本
1. 安装需要用的默认输入法(.apk)到system/app
2. 修改文件 frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<string name="default_input_method" translatable="false">默认输入法 ID</string>
红色标记表示输入法 ID,比如 PinyinIME 为:com.android.inputmethod.pinyin/.PinyinIME
二、适用于 ICS、JB、JB2、KK的 版本:
1. 需要提前将用到的默认输入法(.apk)内置到系统中(请参考如何将APK预置进系统)

2. 修改文件 mediatek/config/${Project}/ProjectConfig.mk
将宏 DEFAULT_INPUT_METHOD 的值设置为所需的输入法;
比如 PinyinIME,则设为:DEFAULT_INPUT_METHOD = com.android.inputmethod.pinyin.PinyinIME

这个值是输入法源码中,包含InputMethodService子类的那个包名.实现InputMethodService的子类的类名。这里比log中打印的完整类名少一个"/",请注意

补充说明

KK的版本不需要一下修改:

上面的修改方法只适用于默认输入法为com.android.inputmethod.pinyin/.PinyinIME这种格式的输入法(即反斜杠后面就是类名的情况),

对于com.google.andr
oid.inputmethod.latin/com.android.inputmethod.latin.LatinIME (即反斜杠后面是完整类名的情况),

这种情况是不支持修改mediatek/config/${Project}/ProjectConfig.mk
里面DEFAULT_INPUT_METHOD的方法来设置默认输入法的。

以com.google.andr
oid.inputmethod.latin/com.android.inputmethod.latin.LatinIME 为例

请改用下面的方法修改,在SettingsProvider 的DatabaseHelper.java中

         

Log.i(TAG, "defaultIME : " + defaultIME);
             if (defaultIME != null) {
                 StringBuffer strBuffer = new StringBuffer(defaultIME);
                 int lastDotPos = defaultIME.lastIndexOf(".");
                 String strInsert = "/";
                 strBuffer.insert(lastDotPos, strInsert);
                 loadSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
                         strBuffer.toString());
             } else {
                 Log.i(TAG, "default IME from IMEFeatureOption is null!!");
             }


请将默认的初始化部分code删除,即将 下面的code都删除掉。

Log.i(TAG, "defaultIME : " + defaultIME);
             if (defaultIME != null) {
                 StringBuffer strBuffer = new StringBuffer(defaultIME);
                 int lastDotPos = defaultIME.lastIndexOf(".");
                 String strInsert = "/";
                 strBuffer.insert(lastDotPos, strInsert);
                 loadSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
                         strBuffer.toString());
             } else {
                 Log.i(TAG, "default IME from IMEFeatureOption is null!!");
             }

然后在删除的后面添加

loadSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
    "com.google.andr
 oid.inputmethod.latin/com.android.inputmethod.latin.LatinIME"); //这里修该默认enable的输入法 loadSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
    "com.google.andr
 oid.inputmethod.latin/com.android.inputmethod.latin.LatinIME");//这里修改默认选中的输入法 
 
 
 
[DESCRIPTION]


KK的一些branch版本,设置默认输入法不成功,是因为KK比较晚的版本把默认输入的代码搬到了InputMethodManagerService.java中。



[SOLUTION]


首先查看InputMethodManagerService.java中的systemRunning函数中是否有下面红色的代码,如果有则把红色后面蓝色的语句注释掉即可。如果没有红色代码可以参考FAQ06663。

if (!mImeSelectedOnBoot) {
                     Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here.");
                     /// M: Loading preinstalled ime from feature option. @{
                     String preInstalledImeName = IMEFeatureOption.DEFAULT_INPUT_METHOD;
                     Slog.i(TAG, "IMEFeatureOption defaultIME : " + preInstalledImeName);
                     if (preInstalledImeName != null) {
                         InputMethodInfo preInstalledImi = null;
                         for (InputMethodInfo imi : mMethodList) {
                             Slog.i(TAG, "mMethodList service info : " + imi.getServiceName());
                             if (preInstalledImeName.equals(imi.getServiceName())) {
                                 preInstalledImi = imi;
                                 break;
                             }
                         }
                         if (preInstalledImi != null) {
                             setInputMethodLocked(preInstalledImi.getId(), NOT_A_SUBTYPE_ID);
                         } else {
                             Slog.w(TAG, "Set preinstall ime as default fail.");
                             resetDefaultImeLocked(mContext);
                         }
                     }
                    /// @}
                     resetStateIfCurrentLocaleChangedLocked();
                     InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(
                             mContext.getPackageManager(),
                             mSettings.getEnabledInputMethodListLocked());
                 }


JB、KK中切换系统语言后默认输入法会自动切换到latin输入法,或者系统预置的默认输入法不能生效



【解法】



JB解决方案:

 可以在文件inputmethodmanagerservice.java中

在构造函数InputMethodManagerService中的最后面,将接收语言改变广播的事件注释掉:

final IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_LOCALE_CHANGED);
        mContext.registerReceiver(
                new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        synchronized(mMethodMap) {
//          checkCurrentLocaleChangedLocked(); //将此行注释掉
                        }
                    }
                }, filter);

这样就可以了。


KK解决方案:

 可以在文件inputmethodmanagerservice.java中

在构造函数InputMethodManagerService中的最后面,将接收语言改变广播的事件注释掉:

final IntentFilter filter = new IntentFilter();
         filter.addAction(Intent.ACTION_LOCALE_CHANGED);
         mContext.registerReceiver(
                 new BroadcastReceiver() {
                     @Override
                     public void onReceive(Context context, Intent intent) {
                         synchronized(mMethodMap) {
                             //resetStateIfCurrentLocaleChangedLocked();//将此行注释掉
                        }
                     }
                 }, filter);

这样就可以了。