1. 程式人生 > >android遙控器新增自定義的鍵值+用遙控器按鍵實現軟鍵盤字元鍵的切換(amlogice平臺) --- (一)

android遙控器新增自定義的鍵值+用遙控器按鍵實現軟鍵盤字元鍵的切換(amlogice平臺) --- (一)

最近的專案客戶有個需求,遙控器上要增加兩個按鍵,分別是系統軟鍵盤的DEL鍵和字元切換鍵(也就是左下角那個按鍵)。任務相對來說比較簡單,所以安排給我這個新手做,廢話不多說,直接上正題,有不對的地方,歡迎指正。

幹活前,先整理下按下遙控器的一個按鍵後,在系統中的邏輯過程:

遙控器的物理鍵值 —> linux的標準鍵值 —> 自定義的字串 —> 定義這個字串 —> android標準鍵值 —> android鍵值上報 —> 所有上報表中鍵值判斷是否為全域性 —> (上報成功)

  1. 以上過程所對應的重要的檔案:

    1. device\amlogic\p201\files\remote.conf //物理鍵值轉化為linux標準鍵值
    2. device\amlogic\p201\files\Vendor_0001_Product_0001.kl //平臺相關linux鍵值轉化為字串。
    3. frameworks/native/include/input/InputEventLabels.h //定義自定義的字串
    4. frameworks/native/include/android/keycodes.h //android標準鍵值表
    5. frameworks/base/core/res/res/values/attrs.xml //自定義鍵值與字串關係
    6. frameworks\base\core\java\android\view\KeyEvent.java //android需要上報的鍵值
    7. frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java //這裡定義的是全域性的按鍵。在這裡定義的按鍵不會發給app做處理。所有上報資料會先在這裡判斷是否要做特殊處理,鍵值的上報可以在這裡擷取。

    因為是平臺相關,所以可能其他平臺的檔案目錄和檔名可能會不一樣,這沒啥關係,android東西都差不多。最基礎的幾個檔案肯定會一樣,比如remote.conf、KeyEvent.java、PhoneWindowManager.java。其他檔案檔案命名及路徑可能會有些差異,建議去KeyEvent.java檔案中檢視註釋資訊。裡面會告訴你增加一個新的android鍵值需要同時修改哪些檔案。以下為部分註釋資訊:

    NOTE: If you add a new keycode here you must also add it to:
    //  isSystem()
    //  isWakeKey()
    //  frameworks/native/include/android/keycodes.h
    //  frameworks/native/include/input/InputEventLabels.h
    //  frameworks/base/core/res/res/values/attrs.xml
    //  emulator?
    //  LAST_KEYCODE

總的來說,新增或者修改遙控器鍵值不外乎分為兩種情況:
1. 鍵值為android標準鍵值中存在的鍵值。
2. 鍵值為android標準鍵值中不存在的鍵值。

如果是第一種情況,那非常幸運,簡單的改改,基本就搞定了,而第二種情況相對來說會麻煩些。當然還有就是修改鍵值,比如兩個按鍵的功能互換,那基本可以看做是第一種情況,處理起來和第一種情況一樣。

在修改之前,需要先知道一點——怎麼去判定android標準鍵值中有沒有自己需要的鍵值或者說判斷某個鍵值到底是不是我要的那個鍵值?最笨的方法就是,改完程式碼以後編譯除錯… 這樣沒必要,非常浪費時間… 樓主是新手,所以一開始… 穩穩的犯了這個2… - -!! 可以在板子的終端輸入以下命令,先在android端看下是否符合自己需求:

input text keyevent 22      (輸入相應的鍵值,即可在androd端看到效果,此處的22對應的鍵值是右鍵,輸入後游標會向右移動。)

來看看兩種情況分別對應的修改步驟。

修改步驟:
遙控器相應功能android對映表存在:
1. 修改remote.conf,將遙控器物理鍵值相對應的android功能鍵值相對應。(注意一般會有副本鍵值,別改錯了)

遙控器相應的功能鍵值不存在:
如果android鍵值不存在,那相應操作的步驟會多些,從底層一直到app層都需要修改。當然也可以直接用一個android標準鍵值中沒有用到的鍵值,這樣會少些步驟,但是為了瞭解這個過程,樓主還是老老實實的從底層一點點改。

1. 修改remote.conf,將遙控器的物理鍵值對映一個在linux對映表沒有用到的鍵值。 
    0x1C 268     ;TV_SWITCH_CHAR
2. 修改Vendor_0001_Product_0001.kl檔案,將上一步linux的鍵值對映一個字串,命名:TV_Switch。
    key 268   TV_SWITCH_CHAR
3. 修改keycodes.h檔案,增新增一個沒有用到的鍵值。 
    //Darren add 20161213
    AKEYCODE_TV_SWITCH_CHAR = 268,
    //Darren add end
4. 修改InputEventLabels.h,增加和上相同的數值,注意命名不同。
    //darren add 20161213
    DEFINE_KEYCODE(TV_SWITCH_CHAR),
    //darren add end
5. 修改attrs.xml,增加相應鍵值。
    <enum name="KEYCODE_TV_SWITCH_CHAR" value="268" />
6. 修改KeyEvent.java 定義相應鍵值。
    //darren add 2016.1213
    public static final int KEYCODE_TV_SWITCH_CHAR = 268;
    //darren add end
7. 語言切換功能不需要做任何處理,可以直接上報,所以不需要改PhoneWindowManager.java檔案,如果按鍵是全域性的比如HOME鍵之類的,那要怎麼處理就在這個檔案裡面寫。

修改完成後,在android端獲取鍵值的方式:

keyCode  == KeyEvent.KEYCODE_DPAD_RIGHT

此節只介紹下增加鍵值的方式。下次再上android端修改android自帶的輸入法,實現使用遙控按鍵實現軟鍵盤字元切換功能。