麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > OS > 安卓 > 正文

Android中外接鍵盤的檢測的實現

2024-09-11 17:15:17
字體:
來源:轉載
供稿:網友

今天來了一個問題:軟鍵盤無法彈出。分析后是因為系統判斷當前有外接硬鍵盤,就會隱藏軟鍵盤。但實際情況并不是這么簡單,該問題只有在特定條件下偶現,具體分析過程就不說了,就是軟硬鍵盤支持上的邏輯問題。借著這個機會整理一下鍵盤檢測的過程。

Configuration

Android系統中通過讀取Configuration中keyboard的值來判斷是否存在外接鍵盤。Configuration中關于鍵盤類型的定義如下,

  public static final int KEYBOARD_UNDEFINED = 0; // 未定義的鍵盤  public static final int KEYBOARD_NOKEYS = 1; // 無鍵鍵盤,沒有外接鍵盤時為該類型  public static final int KEYBOARD_QWERTY = 2; // 標準外接鍵盤  public static final int KEYBOARD_12KEY = 3; // 12鍵小鍵盤

在最常見的情況下,外接鍵盤未連接時keyboard的值為KEYBOARD_NOKEYS,當檢測到鍵盤連接后會將keyboard的值更新為KEYBOARD_QWERTY 。應用就可以根據keyboard的值來判斷是否存在外接鍵盤,InputMethodService.java中有類似的判斷代碼。

  // 軟件盤是否可以顯示  public boolean onEvaluateInputViewShown() {    Configuration config = getResources().getConfiguration();    return config.keyboard == Configuration.KEYBOARD_NOKEYS        || config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES;  }  

現在的問題就轉向Configuration的keyboard是如何更新的。在WindowManagerService.java中,應用啟動時會更新Configuration,相關代碼如下。

  boolean computeScreenConfigurationLocked(Configuration config) {    ......    if (config != null) {      // Update the configuration based on available input devices, lid switch,      // and platform configuration.      config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;      // 默認值為KEYBOARD_NOKEYS      config.keyboard = Configuration.KEYBOARD_NOKEYS;      config.navigation = Configuration.NAVIGATION_NONAV;            int keyboardPresence = 0;      int navigationPresence = 0;      final InputDevice[] devices = mInputManager.getInputDevices();      final int len = devices.length;      // 遍歷輸入設備      for (int i = 0; i < len; i++) {        InputDevice device = devices[i];        // 如果不是虛擬輸入設備,會根據輸入設備的flags來更新Configuration        if (!device.isVirtual()) {          ......          // 如果輸入設備的鍵盤類型為KEYBOARD_TYPE_ALPHABETIC,則將keyboard設置為KEYBOARD_QWERTY          if (device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {            config.keyboard = Configuration.KEYBOARD_QWERTY;            keyboardPresence |= presenceFlag;          }        }      }      ......      // Determine whether a hard keyboard is available and enabled.      boolean hardKeyboardAvailable = config.keyboard != Configuration.KEYBOARD_NOKEYS;      // 更新硬件鍵盤狀態      if (hardKeyboardAvailable != mHardKeyboardAvailable) {        mHardKeyboardAvailable = hardKeyboardAvailable;        mH.removeMessages(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);        mH.sendEmptyMessage(H.REPORT_HARD_KEYBOARD_STATUS_CHANGE);      }      // 如果Setting中SHOW_IME_WITH_HARD_KEYBOARD被設置,將keyboard設置為KEYBOARD_NOKEYS,讓軟件盤可以顯示      if (mShowImeWithHardKeyboard) {        config.keyboard = Configuration.KEYBOARD_NOKEYS;      }      ......    }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美色大成网站www永久男同 | 久久久成人999亚洲区美女 | 精品一区二区三区免费 | 成人福利在线看 | 久久精品亚洲成在人线av网址 | 成人三级视频网站 | 久久久久久99 | 午夜免费一区 | 久草在线视频新 | 欧美亚洲综合在线 | 精品国产一区二区三区四区阿崩 | 在线1区 | 国产乱淫a∨片免费视频 | 欧美日韩高清不卡 | 91久久久久久久 | 黄色网址免费在线播放 | 日韩中文字幕一区二区三区 | 成年人小视频在线观看 | 日本中文高清 | 亚洲精品动漫在线观看 | 视频在线中文字幕 | 91精品视频网址 | 久久久久久久久久久久久国产精品 | 久久精品欧美视频 | 久久久久久久网站 | 一级看片免费视频 | 视频国产一区二区 | 成人一级毛片 | 午夜视频在线免费 | av色先锋| javhdfreejaⅴhd | 欧美亚成人 | 欧美一级黄色录像片 | 99视频网址 | 欧美 日韩 国产 在线 | 欧美成人二区 | 精品一区二区三区在线观看视频 | 狠狠操精品视频 | 欧美精品第1页 | 免费淫视频 | 一区国产在线 |