<">

日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開源 > 綜合技術(shù) > Android 4.3 源碼下如何修改默認(rèn)輸入法

Android 4.3 源碼下如何修改默認(rèn)輸入法

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-10-08 08:00:00 閱讀次數(shù):4434次

因項(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());
              }
          }

把所有的輸入法設(shè)置為可用的。則再上一個(gè)函數(shù)中就可以找你想要的輸入法了,那么在上一個(gè)函數(shù)加一個(gè)判斷條件,判斷循環(huán)的輸入法是否為你想要默認(rèn)的輸入法,是的話就設(shè)置:
  firstFoundSystemIme = i;

  判斷條件如下:

               if (InputMethodUtils.isSystemImeThatHasEnglishKeyboardSubtype(imi)
                          && !imi.isAuxiliaryIme()) {
                      continue;

              }

           for(int m = 0; m < enabledImes.size(); m ++){
            if(enabledImes.get(m).getId()== "你想要設(shè)置的輸入法包名")
                      firstFoundSystemIme = m;
            }
  
  此處可修改為其他的輸入法。
  

  編譯系統(tǒng),燒寫,啟動(dòng)可以看到默認(rèn)的輸入法從傳統(tǒng)的android自帶,變成了你想要輸入法。


PS:新手,剛寫這種分析流程文章

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 成人福利在线看 | 亚洲伦理一区二区 | 国产成人精品网站 | 久久久成人网 | 欧美精品tv | 国产一级免费视频 | 国产精品久久久亚洲 | 欧美日韩在线精品 | 欧美日韩一区不卡 | 精品久久久久久久久久久院品网 | 黄a在线看 | 中文字幕在线视频观看 | 亚洲日韩欧美一区二区在线 | 国产区视频 | 亚洲一区h | 黄色一极毛片 | 天堂网avav | 精品一区精品二区 | 亚洲精品一区二区三区香蕉 | 国产黄色精品 | 国产精品久久久久久久一区二区 | 中文第一区| 免费看操片 | 日韩视频一区二区 | 久久99国产精一区二区三区 | 99r久久| 久久久不卡 | 国产精品免费一区二区 | 日韩欧美二区 | 亚洲精品久久久久中文字幕二区 | 午夜操 | 国产亚洲精品久久久 | 日本一区二区视频在线 | 黄色毛片在线视频 | 成人在线观看www | 91超碰在线播放 | 国产精品久久久久久久久 | 国产福利一区二区三区在线播放 | 亚洲jizzjizz日本少妇 | 亚洲精品二区 | 欧美日韩国产在线一区 |