android键盘映射之二

转载 2012年03月31日 11:20:53

按键、触摸屏流、轨迹球程分析

输入事件分发线程
在frameworks/base/services/java/com/android/server/WindowManagerService.java里创建了一个输入事件分发线程,它负责把事件分发到相应的窗口上去。


按键触摸屏流程分析:

    WindowManagerService类的构造函数

    WindowManagerService()

    mQueue = new KeyQ();

因为 WindowManagerService.java (frameworks\base\services\java\com\android\server)中有:

private class KeyQ extends KeyInputQueue implements KeyInputQueue.FilterCallback

KeyQ 是抽象类 KeyInputQueue 的实现,所以 new KeyQ类的时候实际上在 KeyInputQueue 类中创建了一个线程 InputDeviceReader 专门用来从设备读取按键事件,

代码:

Thread mThread = new Thread("InputDeviceReader") {

    
public void run() {

         // 在循环中调用:
     readEvent(ev);
         ...
         send
= preprocessEvent(di, ev);
         //实际调用的是 KeyQ 类的 preprocessEvent 函数
          ...
        
int keycode = rotateKeyCodeLocked(ev.keycode);
        int[] map = mKeyRotationMap;

        
for (int i=0; i<N; i+=2) {

            
if (map == keyCode)  

            
return map[i+1];

         }
//

         addLocked(di, curTime, ev.flags,RawInputEvent.CLASS_KEYBOARD,
                   newKeyEvent(di, di.mDownTime, curTime, down,keycode,
0, scancode,...));

         QueuedEvent ev
= obtainLocked(device, when, flags, classType, event);
     }
};

readEvent() 实际上调用的是 com_android_server_KeyInputQueue.cpp (frameworks\base\services\jni)中的

static jboolean android_server_KeyInputQueue_readEvent(JNIEnv* env, jobject clazz,jobject event) 来读取事件,

bool res = hub->getEvent(&deviceId, &type, &scancode, &keycode,&flags, &value, &when)调用的是EventHub.cpp (frameworks\base\libs\ui)中的:

    bool EventHub::getEvent (int32_t* outDeviceId, int32_t* outType,

          int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags,

          int32_t* outValue, nsecs_t* outWhen)

在函数中调用了读设备操作:res = read(mFDs.fd, &iev, sizeof(iev));

在构造函数 WindowManagerService()调用 new KeyQ() 以后接着调用了:

    mInputThread = new InputDispatcherThread();       
    ...     

    mInputThread.start();

来启动一个线程 InputDispatcherThread

    run()
    process();
    QueuedEvent ev = mQueue.getEvent(...)

因为WindowManagerService类中: final KeyQ mQueue;

所以实际上 InputDispatcherThread 线程实际上从 KeyQ 的事件队列中读取按键事件,在process() 方法中进行处理事件。

    switch (ev.classType)
    case RawInputEvent.CLASS_KEYBOARD:
        ...
        dispatchKey((KeyEvent)ev.event, 0, 0);
        mQueue.recycleEvent(ev);
        break;
    case RawInputEvent.CLASS_TOUCHSCREEN:
        //Log.i(TAG, "Read next event " + ev);
        dispatchPointer(ev, (MotionEvent)ev.event, 0, 0);
        break;

 case RawInputEvent.CLASS_TRACKBALL:
        dispatchTrackball(ev, (MotionEvent)ev.event, 0, 0);
        break;

===============================================================

补充一些内容:

在写程序时,需要捕获KEYCODE_HOME、KEYCODE_ENDCALL、KEYCODE_POWER这几个按键,但是这几个按键系统做了特殊处理,

在进行dispatch之前做了一些操作,HOME除了Keygaurd之外,不分发给任何其他APP,ENDCALL和POWER也类似,所以需要我们系统

处理之前进行处理。

我的做法是自己定义一个FLAG,在自己的程序中添加此FLAG,然后在WindowManagerServices.java中获取当前窗口的FLAG属性,如果是我

们自己设置的那个FLAG,则不进行特殊处理,直接分发按键消息到我们的APP当中,由APP自己处理。

这部分代码最好添加在

@Override
boolean preprocessEvent(InputDevice device, RawInputEvent event)

方法中,这个方法是KeyInputQueue中的一个虚函数,在处理按键事件之前的一个“预处理”。

PS:对HOME键的处理好像必需要修改PhoneWindowManager.java中的interceptKeyTi方法,具体可以参考对KeyGuard程序的处理。


更改 Android 设备的键盘映射

转自:http://xiaoxia.de/2011/06/change-key-layout-on-android/ framework/base/libs/ui/input.cpp 中有定义 ...
  • haima1998
  • haima1998
  • 2013年06月25日 17:49
  • 759

Android中修改键盘布局或者按键映射时的注意点

在Android中修改键盘布局或者按键映射时,处理在inputdevice中修改上报的SCANCODE之外,还需要修改相应的kl文件。...
  • songjinshi
  • songjinshi
  • 2014年11月27日 10:16
  • 2760

android 按键映射配置.kl文件备忘

key 399   GRAVE key 2     1 key 3     2 key 4     3 key 5     4 key 6     5 key 7     6 key 8...
  • lindonghai
  • lindonghai
  • 2016年10月12日 19:58
  • 735

Android之硬键盘字符映射------KeyCharacterMap

Android之硬键盘映射----字符映射KeyCharacterMap 预备基础知识: http://source.android.com/porting/keymaps_keyboard_...
  • kieven2008
  • kieven2008
  • 2011年03月26日 15:04
  • 12619

Android平台开发-Android keypad map-Android按键识别及映射过程

一、Android底层按键事件处理过程    在系统启动后,在文件。。。中,android 会通过    static const char *device_path = "/dev/input"; ...
  • zhengmeifu
  • zhengmeifu
  • 2012年06月25日 11:10
  • 2113

Android 虚拟机中与PC键盘对应的按键 --14

Home键(小房子键)在键盘上映射的就是home键,这倒是很好记。Menu键用于打开菜单的按键,在键盘上映射的是F2键,PgUp键同样可以。另外,看英文原文的意思,貌似这个键在某些机型上会被设计为左软...
  • jlz87
  • jlz87
  • 2016年05月18日 20:04
  • 267

Android输入系统(三):加载按键映射

映射表基本概念     由于Android调用getEvents得到的key是linux发送过来的scan code,而Android处理的是类似于KEY_UP这种统一类型的key code,因此需...
  • mmmccc000
  • mmmccc000
  • 2015年11月13日 16:28
  • 540

安卓系统按键映射修改

安卓系统按键映射修改 谨记录下靠着自己摸索,安卓平板使用时一个bug的解决方案,及修改按钮功能的方法。这个bug目前搜不到解决方案,能独立解决还是很有成就感的 解决反复打开谷歌语音搜索的bug 手...
  • caozhankui
  • caozhankui
  • 2016年06月12日 22:43
  • 8035

RemapKey等:小巧实用的键盘映射工具

分享几款易用而免费的键盘映射类工具软件:KeyTweak、remapkey、keybmap,以及通过注册表修改键盘映射的方法。所谓键盘映射(或称为键盘修改、keyboard remap、key rem...
  • Zhongxiucheng
  • Zhongxiucheng
  • 2013年03月18日 10:58
  • 4575

linux+android 按键键值映射关系

首先是硬件驱动得到硬件上报的扫描码(不知道这么叫何不合适,反正就是硬件报上来的数据) 然后驱动根据策略与input.h中的映射关系通过input-report上报 即驱动收到键盘按键 "1"   ...
  • bigmarco
  • bigmarco
  • 2011年09月20日 10:29
  • 4397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android键盘映射之二
举报原因:
原因补充:

(最多只允许输入30个字)