天天看點

Android 實體鍵盤的啟用修改

http://blog.csdn.net/drakeblue/article/details/39049495

android系統在外接實體鍵盤的時候,可以在settings的language&input設定中,将預設的輸入設定設為軟鍵盤還是實體鍵盤。

android系統在檢測到有外接usb鍵盤的時候,預設是啟用實體鍵盤,而軟鍵盤将會隐藏。如果需要啟用軟鍵盤,需要将實體鍵盤off掉。

現在,我們修改源代碼,将這個實體鍵盤預設改為off。

通過settings的代碼,我們找到該dialog是通過iiputmethodmanager.aidl的showinputmethodpickerfromclient()方法通知另外的地方彈出的對話。

而showinputmethodpickerfromclient()方法的實作是在frameworks/base/services/java/com/android/server/inputmethodmanagerservice.java中。

1795行,方法//

@override

    public void showinputmethodpickerfromclient(iinputmethodclient client) {

        synchronized (mmethodmap) {

            if (mcurclient == null || client == null

                    || mcurclient.client.asbinder() != client.asbinder()) {

                slog.w(tag, "ignoring showinputmethodpickerfromclient of uid "

                        + binder.getcallinguid() + ": " + client);

            }

            // always call subtype picker, because subtype picker is a superset of input method

            // picker.

            mhandler.sendemptymessage(msg_show_im_subtype_picker);

        }

    }

該handler的處理在2050行;

    public boolean handlemessage(message msg) {

        handlercaller.someargs args;

        switch (msg.what) {

            case msg_show_im_picker:

                showinputmethodmenu();

                return true;

            case msg_show_im_subtype_picker:

                showinputmethodsubtypemenu();

            ......

繼續跟蹤showinputmethodsubtypemenu()方法; 2317行

private void showinputmethodsubtypemenu() {

        showinputmethodmenuinternal(true);

最後找到關鍵方法showinputmethodmenuinternal(); 2344行;

這個方法主要是擷取系統輸入法,然後進行彈框顯示。而我們的實體鍵盤預設設定看在下面代碼片段中。

final switch hardkeyswitch =  ((switch)mswitchingdialogtitleview.findviewbyid(

                    com.android.internal.r.id.hard_keyboard_switch));

            log.d(tag, "input isenabled: " + mwindowmanagerservice.ishardkeyboardenabled());     

            hardkeyswitch.setchecked(mwindowmanagerservice.ishardkeyboardenabled());

hardkeyswitch.setoncheckedchangelistener(

                    new oncheckedchangelistener() {

                        @override

                        public void oncheckedchanged(

                                compoundbutton buttonview, boolean ischecked) {

                            mwindowmanagerservice.sethardkeyboardenabled(ischecked);

                        }

                    });

我們看到該switch的checked設定是在調用的windowmanagerservice的一個boolean值的get方法。接着往裡走

/frameworks/base/services/java/com/android/server/wm/windowmanagerservice.java

關鍵代碼:行6618 computescreenconfigurationlocked()方法中

boolean hardkeyboardavailable = config.keyboard != configuration.keyboard_nokeys;

            if (hardkeyboardavailable != mhardkeyboardavailable) {

                mhardkeyboardavailable = hardkeyboardavailable;

                mhardkeyboardenabled = !hardkeyboardavailable;

                mh.removemessages(h.report_hard_keyboard_status_change);

                mh.sendemptymessage(h.report_hard_keyboard_status_change);

            if (!mhardkeyboardenabled) {

                config.keyboard = configuration.keyboard_nokeys;

這裡将會讀取實體鍵盤是否可用,如果可用将會指派給mhardkeyboardenabled為true,然後hardkeyswitch set的值将會是這個可用的true,

我這裡将hardkeyboardavailable取反賦給mhardkeyboardenabled。

繼續閱讀