Android默認輸入法

    工作時經常會接到修改默認輸入法的需求,在網上也可以找到很多這方面的資料,但有很多是修改了沒起作用的。有一部分是因爲他們只是默認了輸入法,而沒有使可用輸入法。要默認的輸入法一定要在編譯系統時預置進去,要修改的地方有兩處:

frameworks\base\packages\SettingsProvider\res\values\defaults.xml

frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java

其實很多的Android默認值都是在defaults.xml中設置的,默認輸入法在defaults的修改是增加

<string name="enabled_input_methods" translatable="false">"com.mls.numkeyboard/org.nyanya.android.traditionalt9.TraditionalT9:com.android.inputmethod.latin/.LatinIME"</string>
<string name="default_input_methods" translatable="false">"com.mls.numkeyboard/org.nyanya.android.traditionalt9.TraditionalT9"</string>
com.mls.numkeyboard是輸入法的包名,org.nyanya.android.traditionalt9.TraditionalT9是輸入法的service的name.

然後再在DatabaseHelper.java的loadSecureSettings(SQLiteDatabase db)方法的最後增加

loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS, R.string.enabled_input_methods);
loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD, R.string.default_input_methods);
編譯燒錄系統修改默認輸入法就完成了。默認輸入法之後,切換系統語言後當前輸入法可能也會切換爲Android鍵盤。

如果想要當前輸入法不隨着系統語言的改變而改變,可以找到frameworks\base\services\core\java\com\android\server\InputMethodManagerService.java

在InputMethodManagerService中找到代碼

// IMMS wants to receive Intent.ACTION_LOCALE_CHANGED in order to update the current IME
 // according to the new system locale.
        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);
把resetStateIfCurrentLocaleChangedLocked();註釋掉之後當前輸入法就不會因爲切換系統語言而改變了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章