日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android外置传感器,Android中外接键盘的检测的实现

發布時間:2025/3/15 Android 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android外置传感器,Android中外接键盘的检测的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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;

}

......

}

影響Configuration中keyboard的值有,

默認值為KEYBOARD_NOKEYS,表示沒有外接鍵盤。

當輸入設備為KEYBOARD_TYPE_ALPHABETIC時,更新為KEYBOARD_QWERTY,一個標準鍵盤。

當Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD為1時,設置為KEYBOARD_NOKEYS,目的是讓軟鍵盤可以顯示。

inputflinger

接下來需要關注輸入設備時何時被設置KEYBOARD_TYPE_ALPHABETIC的。搜索代碼可以看到,這個flag實在native代碼中設置的,代碼在inputflinger/InputReader.cpp中。native和java使用了同一定義值,如果修改定義時需要注意同時修改。native中的名字為AINPUT_KEYBOARD_TYPE_ALPHABETIC。

InputDevice* InputReader::createDeviceLocked(int32_t deviceId, int32_t controllerNumber,

const InputDeviceIdentifier& identifier, uint32_t classes) {

InputDevice* device = new InputDevice(&mContext, deviceId, bumpGenerationLocked(),

controllerNumber, identifier, classes);

......

if (classes & INPUT_DEVICE_CLASS_ALPHAKEY) {

keyboardType = AINPUT_KEYBOARD_TYPE_ALPHABETIC;

}

......

return device;

}

InputReader在增加設備時,根據classes的flag來設置鍵盤類型。這個flag又是在EventHub.cpp中設置的。

status_t EventHub::openDeviceLocked(const char *devicePath) {

......

// Configure the keyboard, gamepad or virtual keyboard.

if (device->classes & INPUT_DEVICE_CLASS_KEYBOARD) {

// 'Q' key support = cheap test of whether this is an alpha-capable kbd

if (hasKeycodeLocked(device, AKEYCODE_Q)) {

device->classes |= INPUT_DEVICE_CLASS_ALPHAKEY;

}

......

}

看到這里就比較明確了,在EventHub加載設備時,如果輸入設備為鍵盤,并且帶有'Q'鍵,就認為這是一個標準的外接鍵盤。但為何判斷'Q'鍵還不是很清楚。

keylayout

上面說道通過'Q'鍵來判斷是否為外接鍵盤,這個'Q'鍵是Android的鍵值,鍵值是否存在是通過一個keylayout文件決定的。kl文件存儲在目標系統的/system/usr/keylayout/下,系統可以有多個kl文件,根據設備的ID來命名。當系統加載鍵盤設備時,就會根據設備的Vendor ID和Product ID在/system/usr/keylayout/下尋找kl文件。例如一個kl文件名為”Vendor_0c45_Product_1109.kl“,表明設備的Vendor ID為0c45,Product ID為1109。一個kl的內容示例如下,

key 1 BACK

key 28 DPAD_CENTER

key 102 HOME

key 103 DPAD_UP

key 105 DPAD_LEFT

key 106 DPAD_RIGHT

key 108 DPAD_DOWN

key 113 VOLUME_MUTE

key 114 VOLUME_DOWN

key 115 VOLUME_UP

key 142 POWER

鍵值映射需要使用關鍵之”key“進行聲明,之后跟著的數字為Linux驅動中的鍵值定義,再后面的字符串是Android中按鍵的名稱。'Q'鍵是否存在完全取決于kl文件中是否有映射,而不是實際物理鍵是否存在。kl文件的查找也是有一個規則的,其查找順序如下,

/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl

/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl

/system/usr/keylayout/DEVICE_NAME.kl

/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl

/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl

/data/system/devices/keylayout/DEVICE_NAME.kl

/system/usr/keylayout/Generic.kl

/data/system/devices/keylayout/Generic.kl

同時支持軟硬鍵盤

有了上面的知識,就可以給出同時支持軟硬鍵盤的方案。

修改源碼邏輯,設置Configuration中keyboard的值為KEYBOARD_NOKEYS。這種Hack其實不好,破壞原生邏輯,缺乏移植性。非要這樣改的話,可以增加對設備的判斷,只有特定的鍵盤設備設置為KEYBOARD_NOKEYS,減少副作用。

修改keylayout,去掉'Q'鍵映射。有時kl文件寫的不標準,為了通用把所有鍵的映射都寫上了,實際硬件鍵卻很少,我們就是這種情況。應該按照真實硬件來編寫kl文件。

設置Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD為1。我認為這是最標準的修改方式,也非常方便。

關于第三個方案的修改方式有兩種,一種是修改缺省的setting值,在文件frameworks/base/packages/SettingsProvider/res/values/defaults.xml中增加,

1

另一種方式是在系統啟動時在代碼中通過接口進行設置。

Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 1);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的android外置传感器,Android中外接键盘的检测的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品成人国产乱 | 国产女同91疯狂高潮互磨 | 性一交一乱一色一视频麻豆 | 久艹在线 | 欧美日韩亚洲高清 | 性色av浪潮| 日批视频在线看 | 国产猛男猛女超爽免费视频 | 中文字幕一区二区三区人妻电影 | 一级片免费观看 | 五月在线 | 黄色网址在线免费看 | 国内精品视频在线播放 | 一级免费毛片 | 日本h片在线观看 | 五月天色婷婷综合 | 波多野结衣在线观看视频 | 色黄视频在线观看 | 一本综合久久 | 亚洲国产精品av | 亚洲欧美在线看 | 亚洲视频在线观看网址 | 四虎在线视频免费观看 | 欧美一级久久 | 中文字幕一区二区人妻电影丶 | 亚洲三区精品 | 成人午夜久久 | 久久综合久色欧美综合狠狠 | 日韩一区二区三区精品视频 | 巨大乳の揉んで乳榨り奶水 | 最新国产精品视频 | 久久中文一区 | 超碰在线国产97 | 国产精品午夜未成人免费观看 | 一二三区精品 | 成人吃奶视频 | 色天天| 亚洲免费观看 | 脱裤吧导航| 国产丝袜精品视频 | 椎名空在线播放 | 日本在线视频不卡 | 精品伦理一区二区 | 一区视频在线免费观看 | 国产精品一区二区在线看 | 777精品久无码人妻蜜桃 | 欧美精品福利 | 好吊操这里只有精品 | 免费在线你懂的 | 国产一区二区三区影院 | 日本aaa级片 | 高潮毛片无遮挡免费看 | 中文字幕有码无码人妻av蜜桃 | 国模私拍一区二区三区 | 亚洲精品中文字幕成人片 | 欧美做爰性生交视频 | 美妇湿透娇羞紧窄迎合 | 高潮疯狂过瘾粗话对白 | 国产高清在线视频 | 欧美成人一区二免费视频软件 | 视频一区国产 | 少妇视频在线播放 | 日韩在线第一 | 欧美人与性动交a欧美精品 日韩免费高清视频 | 超碰伦理 | 免费看污片网站 | 暗呦丨小u女国产精品 | 亚洲国产精品视频 | 国产精品高潮呻吟av | 亚洲一区免费在线 | 伊人网视频在线观看 | 少妇影院在线观看 | 99视频在线观看视频 | 蜜桃av在线免费观看 | 国产精品xxx在线观看www | 欧美精品久| 国产成人观看 | 色综合av在线 | 99re这里只有精品在线 | 一级作爱片| 黄色在线不卡 | 午夜精品久久久久久久久久久久久蜜桃 | 精品一区二区三区久久 | brazzers欧美一区二区 | 男人天堂电影 | 午夜嘿嘿嘿 | 久久天天躁狠狠躁夜夜躁 | aaa亚洲| 蜜桃成人在线视频 | 成人精品在线视频 | 日韩在线第三页 | 高潮一区二区三区 | 激情视频在线播放 | 黄色大片视频网站 | 黄色应用在线观看 | 狠狠夜夜 | 国产精品免费av一区二区三区 | 图片区 小说区 区 亚洲五月 | 久久久久久久9999 |