安卓鍵盤輸入識別

2021-06-23 04:41:00 字數 2743 閱讀 5223

一、     文件概述

本文件主要描述如何對安卓系統中外部鍵盤輸入進行識別,根據輸入裝置的不同採取不同的操作。

二、     原理說明

系統使用的是cubieboard2開發板(即樹莓派3),執行安卓4.2作業系統。其硬體的結構如下:

按照門禁系統的業務流程,正常情況下通過物理按鍵輸入房號進行呼叫或者開門密碼,同時也可以通過刷id或ic卡直接開門。

在使用linux或其他較為底層的嵌入式系統中,根據介面的不同,可以輕易的識別外部輸入裝置,從而進行業務判斷。而本應用場景基於安卓系統,由於良好的封裝性,底層輸入對於上層應用來說,都是鍵盤輸入,並沒有明顯的區分輸入究竟是物理按鍵還是rfid讀卡器。

不過,在對於安卓系統的一定了解之後,發現底層輸入最終通過事件傳送給安卓系統,安卓系統對獲取到的事件進行處理。然後發現edittext中有這樣的乙個介面:

public boolean onkey(view v, int keycode, keyevent event);
於是,這裡猜想,根據keyevent的資訊應該可以識別不同的輸入裝置。

於是重寫該介面,將每次獲取到的事件都列印出來:

edittext = (edittext) findviewbyid(r.id.et_main_num);

edittext.setonkeylistener(new onkeylistener()

});

然後分別進行按鍵輸入和rfid刷卡輸入,可看到如下資訊:

物理按鍵輸入:

v/keyevent(8551): input device 8: rfid reader with keyboard usb rfid reader

v/keyevent(8551): descriptor: b7e9cbd07a552feaf97d1ae331d71a89ea1007c9

v/keyevent(8551): generation: 28

v/keyevent(8551): location: external

v/keyevent(8551): keyboard type: alphabetic

v/keyevent(8551): has vibrator: false

v/keyevent(8551): sources: 0x101 ( keyboard )

rfid刷卡輸入:

v/keyevent(8551): input device 6: sw-keyboard

v/keyevent(8551): descriptor: 485d69228e24f5e46da1598745890b214130dbc4

v/keyevent(8551): generation: 10

v/keyevent(8551): location: built-in

v/keyevent(8551): keyboard type: non-alphabetic

v/keyevent(8551): has vibrator: false

v/keyevent(8551): sources: 0x101 ( keyboard )

可以看出,keyevent中的資訊包含了裝置的名稱,描述符等資訊,在處理時可以根據這些資訊區分輸入裝置。其中sources欄位表明無論哪種輸入,均被安卓系統識別為鍵盤輸入。

通過這個實驗,發現每次按鍵輸入或者刷卡輸入時,keyevent都會被列印兩次,導致這個的原因是因為onkey()會分別在action_down和action_up時被觸發,action_down和action_up分別對應按鍵按下和按鍵鬆開動作。

這裡需要注意的是,在動作為action_up的keyevent事件之後,按鍵的值才會顯示在對應的edittext上。如果在動作為action_down的keyevent事件中,獲取edittext的文字,只能獲取到不包括當前按下的按鍵的文字,當前的按鍵值可以通過keycode獲取。

利用這個特性,當不需要將按鍵值顯示到edittext上時,可以只處理action_down的事件,丟棄action_up的事件。

可參照如下**:

cardid=new stringbuffer();

edittext = (edittext) findviewbyid(r.id.et_main_num);

edittext.setonkeylistener(new onkeylistener() else

//直接返回true,後續的系統監聽將得不到這個事件,這裡將獲取到的數字不在edittext上顯示。

return true;

}else if(event.getaction()==keyevent.action_up)

}else if (event.getdevice().getsources()==257)else if(event.getaction()==keyevent.action_up)

} //除了以上的幾種裝置之外,其他的裝置返回false,避免其他裝置無法正常工作

return false;

}});

需要注意的是,這裡的onkey()介面只會在物理輸入時進行觸發,包括外接的滑鼠鍵盤。而使用系統自帶的虛擬鍵盤輸入時並不會觸發。

安卓中鍵盤輸入事件的實現

鍵盤的處理有幾種方式,其中看需求情況,有的是 鍵盤進行事件處理,有的是正在輸入時候進行鍵盤處理,今天我實現鍵盤輸入時進行事件的處理 et01.addtextchangedlistener new textwatcher override public void beforetextchanged c...

終止鍵盤輸入

一 檔案 流和鍵盤輸入 1 檔案是一塊儲存資訊的儲存器區域。2 具有強大 靈活等特點的c語言具有許多用於開啟 讀 寫和關閉檔案的庫函式。在乙個級別上,可以使用宿主作業系統的基本檔案工具來處理檔案,這被稱為低階i o。c還以第二種級別處理檔案,稱為標準i o包。這包括建立於處理檔案的i o函式的標準模...

python 鍵盤輸入

python鍵盤輸入與其他程式語言基本類似,回車鍵結束輸入 下面來看一段鍵盤輸入年月日,英文輸出示例 1 usr bin env python2 coding utf 8 3 定義英文月份 4 months january february march april may june july aug...