">
因項(xiàng)目(Android 4.3)需求需要修改默認(rèn)輸入法,本來(lái)想的是,這個(gè)應(yīng)該很簡(jiǎn)單的撒。隨google之~,發(fā)現(xiàn)網(wǎng)上主要羅列出以下這種方法:
在 frameworksasecore
es
esvaluesconfig.xml 添加一個(gè)屬性:
<!--leo add-->
<string name="config_default_input_method">com.android.inputmethod.pinyin/.PinyinIME</string>
在frameworksaseservicesjavacomandroidserverInputMethodManagerService.java
的方法buildInputMethodListLocked()里添加:
String defaultIme = Settings.Secure.getString(mContext
.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
if ( defaultIme == null )
{
final Resources res = mContext.getResources();
try
{
//frameworksasecore
es
esvaluesconfig.xml
String myIME = res.getString( com.android.internal.R.string.config_default_input_method );
if ( myIME != null && myIME.length() > 0 )
{
Settings.Secure.putString( mContext.getContentResolver(),
Settings.Secure.DEFAULT_INPUT_METHOD,
myIME );
}
}
catch ( Exception e )
{
}
}
但是在自己的源碼中修改后,刷機(jī)調(diào)試發(fā)現(xiàn)木有作用,而且這種直接修改源代碼是不是不好呢?
后來(lái)發(fā)現(xiàn)這是4.2的源碼,是不是4.3的不一樣呢。好吧,木有辦法 從源碼開始分析吧!(前輩指導(dǎo),google沒(méi)有,就看源碼)
通過(guò)log跟蹤,發(fā)現(xiàn)系統(tǒng)第一次初始化的時(shí)候會(huì)調(diào)用以下的函數(shù),并且以后的開機(jī)中該函數(shù)不會(huì)在被調(diào)用,而下面的函數(shù)功能是重置可用的輸入法選現(xiàn)(在frameworks/base/core/java/com/android/internal/inputmethod/InputMethodUtils.java 中)
private void resetDefaultImeLocked(Context context) {
// Do not reset the default (current) IME when it is a 3rd-party IME
if (mCurMethodId != null
&& !InputMethodUtils.isSystemIme(mMethodMap.get(mCurMethodId))) {
return;
}
InputMethodInfo defIm = null;
for (InputMethodInfo imi : mMethodList) {
if (defIm == null) {
if (InputMethodUtils.isValidSystemDefaultIme(
mSystemReady, imi, context)) {
defIm = imi;
Slog.i(TAG, "Selected default: " + imi.getId());
}
}
}
if (defIm == null && mMethodList.size() > 0) {
defIm = InputMethodUtils.getMostApplicableDefaultIME(
mSettings.getEnabledInputMethodListLocked());
Slog.i(TAG, "No default found, using " + defIm.getId());
}
注意黃色加粗的部分,當(dāng)系統(tǒng)暫無(wú)默認(rèn)輸入法時(shí),選取適用性最廣的輸入法(臥草,還帶這樣的),并調(diào)用InputMethodUtils.getMostApplicableDefaultIME函數(shù) ,好吧繼續(xù)看下面的函數(shù):
public static InputMethodInfo getMostApplicableDefaultIME(
List<InputMethodInfo> enabledImes) {
if (enabledImes != null && enabledImes.size() > 0) {
// We'd prefer to fall back on a system IME, since that is safer.
int i = enabledImes.size();
int firstFoundSystemIme = -1;
while (i > 0) {
i--;
final InputMethodInfo imi = enabledImes.get(i);
if (InputMethodUtils.isSystemImeThatHasEnglishKeyboardSubtype(imi)
&& !imi.isAuxiliaryIme()) {
Return imi;
}
if (firstFoundSystemIme < 0 && InputMethodUtils.isSystemIme(imi)
&& !imi.isAuxiliaryIme()) {
firstFoundSystemIme = i;
}
}
return enabledImes.get(Math.max(firstFoundSystemIme, 0));
同樣的請(qǐng)注意黃色地方的代碼(紅色部分表明是否是一個(gè)合法的系統(tǒng)輸入法,同時(shí)還含有英文亞鍵盤等特性,普通的輸入法無(wú)特性,而AOSP鍵盤卻有此特性,系統(tǒng)會(huì)直接return 該輸入法)。好吧,就你了!既然你這么規(guī)定,那我就強(qiáng)制改唄,所以若要修改默認(rèn)輸入,可在此處修改,當(dāng)系統(tǒng)檢測(cè)到AOSP鍵盤時(shí),不直接返回,而是繼續(xù)檢測(cè)系統(tǒng)的可用的鍵盤(當(dāng)系統(tǒng)第一次啟動(dòng)時(shí),一般只有系統(tǒng)鍵盤可用,所以應(yīng)該將所有的輸入法設(shè)置為可用,修改以下的函數(shù):
public void enableAllIMEsIfThereIsNoEnabledIME() {
if (!TextUtils.isEmpty(getEnabledInputMethodsStr())) {
StringBuilder sb = new StringBuilder();
final int N = mMethodList.size();
for (int i = 0; i < N; i++) {
InputMethodInfo imi = mMethodList.get(i);
Slog.i(TAG, "Adding: " + imi.getId());
if (i > 0) sb.append(':');
sb.append(imi.getId());
}
putEnabledInputMethodsStr(sb.toString());
}
}
判斷條件如下:
if (InputMethodUtils.isSystemImeThatHasEnglishKeyboardSubtype(imi)
&& !imi.isAuxiliaryIme()) {
continue;
}
編譯系統(tǒng),燒寫,啟動(dòng)可以看到默認(rèn)的輸入法從傳統(tǒng)的android自帶,變成了你想要輸入法。
PS:新手,剛寫這種分析流程文章