1.首先分析为了将OK键转换成鼠标左键的工作:

EventHub.h中

(1)定义NEED_CHANGE_MODE:

#define NEED_CHANGE_MODE

修改RawEvent的结构,增加 keyCode、flags两个成员

struct RawEvent {nsecs_t when;int32_t deviceId;int32_t type;int32_t code;int32_t value;int32_t keyCode;uint32_t flags;
};

EventHub.cpp中

(2)在EventHub::openDeviceLocked()中不自动获取deviceID,而是通过指定(可能可以优化):

 // Allocate device.  (The device object takes ownership of the fd at this point.)int32_t deviceId = mNextDeviceId++;

改成:

    // Allocate device.  (The device object takes ownership of the fd at this point.)int32_t deviceId;
#ifdef NEED_CHANGE_MODEif(strstr(identifier.name,"Hillcrest")){//identifier.name=="Hillcrest Labs Virtual Pointer"||identifier.name=="Hillcrest MotionEngine Cursor Mover: #0"){//Compatible with two kinds of DongledeviceId = SENSOR_MOUSE_ID;}else if(identifier.name=="XXX"){deviceId = IR_RC_ID;}else{deviceId = mNextDeviceId++;}
#else deviceId = mNextDeviceId++;
#endif

(3)在InputReader.h中

定义一些会用到的变量:

#ifdef NEED_CHANGE_MODE#define SCANCODE_LEFT_MOUSE  272#define SCANCODE_CENTER 28#define SCANCODE_DPAD_LEFT 105#define SCANCODE_DPAD_RIGHT 106#define SCANCODE_DPAD_UP 103#define SCANCODE_DPAD_DOWN 108#define SCANCODE_MOUSE_WAKE 704#define AKEYCODE_MOUSE_WAKE 4021enum {LOCAL_INDEX_FIRST ,LOCAL_INDEX_SECOND ,LOCAL_INDEX_THIRD ,};enum{KEYEVENT_ACTION_UP,KEYEVENT_ACTION_DOWN,KEYEVENT_ACTION_REPEAT,};bool mMousetoFocus;bool mOktoMouseSure;bool mFlags;bool mTrueMouse;nsecs_t mWaitTime;bool mPowerOn;uint32_t isCursor;void removeFocusEventLocked(RawEvent* rawEvents, size_t count);
#endif

(4)在InputReader.cpp中做具体修改:

定义全局bool变量,用于判断是否要显示鼠标

static bool bEnablePointer = false;

在InputReader的构造函数中定义一些局部变量

#ifdef NEED_CHANGE_MODEmMousetoFocus=false;mOktoMouseSure=true;isCursor=0;mFlags=false;mWaitTime=0;mTrueMouse=false;mPowerOn=false;
#endif

添加一个移除焦点的函数:

#ifdef NEED_CHANGE_MODE
void InputReader::removeFocusEventLocked(RawEvent* rawEvents, size_t count){RawEvent* rawEvent = rawEvents;int32_t deviceId = IR_RC_ID;rawEvent->deviceId=deviceId;rawEvent->flags=0;rawEvent->keyCode=AKEYCODE_MOUSE_WAKE;rawEvent->code=SCANCODE_MOUSE_WAKE;rawEvent->type=1;rawEvent->value=1;//down event rawEvent[LOCAL_INDEX_SECOND].deviceId=deviceId;rawEvent[LOCAL_INDEX_SECOND].flags=0;rawEvent[LOCAL_INDEX_SECOND].keyCode=AKEYCODE_MOUSE_WAKE;rawEvent[LOCAL_INDEX_SECOND].code=SCANCODE_MOUSE_WAKE;rawEvent[LOCAL_INDEX_SECOND].type=1;rawEvent[LOCAL_INDEX_SECOND].value=0;//up eventprocessEventsForDeviceLocked(deviceId, rawEvent, count);
}
#endif

处理在void InputReader::processEventsLocked()函数中:

void InputReader::processEventsLocked(const RawEvent* rawEvents, size_t count) {for (const RawEvent* rawEvent = rawEvents; count;) {int32_t type = rawEvent->type;size_t batchSize = 1;if (type < EventHubInterface::FIRST_SYNTHETIC_EVENT) {int32_t deviceId = rawEvent->deviceId;while (batchSize < count) {if (rawEvent[batchSize].type >= EventHubInterface::FIRST_SYNTHETIC_EVENT|| rawEvent[batchSize].deviceId != deviceId) {break;}batchSize += 1;}
#if DEBUG_RAW_EVENTSALOGD("BatchSize: %d Count: %d", batchSize, count);
#endif
#ifdef NEED_CHANGE_MODEuint32_t classes = mEventHub->getDeviceClasses(deviceId);if(SENSOR_MOUSE_ID != deviceId && (classes & INPUT_DEVICE_CLASS_CURSOR)){
#if DEBUG_RAW_EVENTSALOGD("type:%d scancode:%d keycode:%d vlaue:%d flags:%d",rawEvent->type,rawEvent->code,rawEvent->keyCode,rawEvent->value,rawEvent->flags);
#endif}else{if(!mPowerOn && rawEvent->type== EV_REL){//wake mouse for the first timemOktoMouseSure = false;//Allows you to convert the OK key to mouse left keymMousetoFocus = true;//unfade the cursormPowerOn = true;// the first use of the mouse after system launch}RawEvent* rawEventLocal = const_cast<RawEvent*>(rawEvent);nsecs_t now;now = systemTime(SYSTEM_TIME_MONOTONIC);if(mWaitTime==0){mWaitTime=now;}else{if((now-mWaitTime)*0.000000001>15){if(rawEventLocal->code == SCANCODE_CENTER/*||rawEvent[1].scanCode==28*/){processEventsForDeviceLocked(deviceId, rawEventLocal, batchSize);mWaitTime=now;mMousetoFocus=false;//fade the cursorbreak;}else{if(rawEventLocal->type==EV_REL){//wake up the mouse  after sleepmOktoMouseSure = false;//Allows you to convert the OK key to mouse left keymMousetoFocus = true;//unfade the cursor}else if(rawEventLocal->code == SCANCODE_LEFT_MOUSE/*The left Key of Mouse of the Remote Controller*/||rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_LEFT_MOUSE/*The left Key of  Any Mouse*/){mMousetoFocus=false;//fade the cursor}else{mOktoMouseSure=true;//Don't intercept the OK keymFlags = true;//Mark the mouse after dormancy}}}mWaitTime=now;              }if(mFlags && rawEventLocal->type==EV_REL){//The mouse be awakened first after dormancymOktoMouseSure = false;//Allows you to convert the OK key to mouse left keymFlags = false;mMousetoFocus = true;//unfade the cursor//Change the current event into the eliminational focus event.removeFocusEventLocked(rawEventLocal, batchSize);break;}if(!mTrueMouse){if(rawEventLocal->code == SCANCODE_LEFT_MOUSE||rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_LEFT_MOUSE){        if(!mMousetoFocus){mMousetoFocus=true;//unfade the cursormOktoMouseSure=false;//Allows you to convert the OK key to mouse left keyALOGD("get mouse left click!: deviceid %d scancode: %d", deviceId, rawEvent->code);//Change the current event into the eliminational focus event.removeFocusEventLocked(rawEventLocal, batchSize);break;}}else if(rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_UP || rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_DOWN|| rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_LEFT|| rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_RIGHT|| rawEventLocal->code == SCANCODE_DPAD_UP || rawEventLocal->code == SCANCODE_DPAD_DOWN || rawEventLocal->code == SCANCODE_DPAD_LEFT || rawEventLocal->code == SCANCODE_DPAD_RIGHT/*The direction key of  Remote Controller in IR mode.*/||(rawEventLocal->value>458830&&rawEventLocal->value<458835)/*The direction key of  Keyboard.*/){mMousetoFocus=false;//fade the cursormOktoMouseSure = true;//Don't intercept the OK key}if(!mMousetoFocus/* Drop The Cursor offset event of Mouse */){for(size_t s=0;s<batchSize;s++){                           if(rawEventLocal[s].type == EV_REL){                              isCursor = 1;                              break;                          }                           }                       if(isCursor){                           for(size_t j=0 ; j<batchSize; j++){                               rawEventLocal[j].deviceId = 0;                         rawEventLocal[j].type =    -1;                             rawEventLocal[j].code =    -1;                             rawEventLocal[j].value =   -1;                             rawEventLocal[j].keyCode = -1;                             rawEventLocal[j].flags =   -1;                             rawEventLocal[j].when =    -1;                             }                           isCursor = 0;                  }}}     if(!mOktoMouseSure && !bEnablePointer){//The OK key is converted to the mouse left keyif(rawEventLocal[LOCAL_INDEX_SECOND].code== SCANCODE_CENTER){deviceId=SENSOR_MOUSE_ID;if(rawEventLocal[LOCAL_INDEX_SECOND].value==KEYEVENT_ACTION_DOWN){rawEventLocal->deviceId=SENSOR_MOUSE_ID;rawEventLocal->flags=0;rawEventLocal->value=KEYEVENT_ACTION_DOWN;rawEventLocal->keyCode=0;rawEventLocal->code=SCANCODE_LEFT_MOUSE;rawEventLocal->type=1;rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;rawEventLocal[LOCAL_INDEX_SECOND].flags=0;rawEventLocal[LOCAL_INDEX_SECOND].code=0;rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;rawEventLocal[LOCAL_INDEX_SECOND].type=0;rawEventLocal[LOCAL_INDEX_SECOND].value=0;rawEventLocal[LOCAL_INDEX_THIRD].deviceId=SENSOR_MOUSE_ID;rawEventLocal[LOCAL_INDEX_THIRD].flags=0;rawEventLocal[LOCAL_INDEX_THIRD].code=0;rawEventLocal[LOCAL_INDEX_THIRD].keyCode=0;rawEventLocal[LOCAL_INDEX_THIRD].type=0;rawEventLocal[LOCAL_INDEX_THIRD].value=0; mTrueMouse=true;}  else if(rawEventLocal[LOCAL_INDEX_SECOND].value==KEYEVENT_ACTION_UP){rawEventLocal->deviceId=SENSOR_MOUSE_ID;rawEventLocal->flags=0;rawEventLocal->value=KEYEVENT_ACTION_UP;rawEventLocal->keyCode=0;rawEventLocal->code=SCANCODE_LEFT_MOUSE;rawEventLocal->type=1;rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;rawEventLocal[LOCAL_INDEX_SECOND].flags=0;rawEventLocal[LOCAL_INDEX_SECOND].code=0;rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;rawEventLocal[LOCAL_INDEX_SECOND].type=0;rawEventLocal[LOCAL_INDEX_SECOND].value=0;                rawEventLocal[LOCAL_INDEX_THIRD].deviceId=SENSOR_MOUSE_ID;rawEventLocal[LOCAL_INDEX_THIRD].flags=0;rawEventLocal[LOCAL_INDEX_THIRD].code=0;rawEventLocal[LOCAL_INDEX_THIRD].keyCode=0;rawEventLocal[LOCAL_INDEX_THIRD].type=0;rawEventLocal[LOCAL_INDEX_THIRD].value=0;   mTrueMouse=false;}}else if(rawEventLocal->code== SCANCODE_CENTER/*The enter key / "OK" key event in IR mode*/){deviceId=SENSOR_MOUSE_ID;if(rawEventLocal->value==KEYEVENT_ACTION_REPEAT){mTrueMouse=true;break;}if(batchSize==4){rawEventLocal->deviceId=SENSOR_MOUSE_ID;rawEventLocal->flags=0;rawEventLocal->value=KEYEVENT_ACTION_DOWN;rawEventLocal->keyCode=0;rawEventLocal->code=SCANCODE_LEFT_MOUSE;rawEventLocal->type=1;rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;      rawEventLocal[LOCAL_INDEX_THIRD].deviceId=SENSOR_MOUSE_ID;rawEventLocal[LOCAL_INDEX_THIRD].flags=0;rawEventLocal[LOCAL_INDEX_THIRD].code=SCANCODE_LEFT_MOUSE;rawEventLocal[LOCAL_INDEX_THIRD].keyCode=0;rawEventLocal[LOCAL_INDEX_THIRD].type=1;rawEventLocal[LOCAL_INDEX_THIRD].value=KEYEVENT_ACTION_UP;rawEventLocal[3].deviceId=SENSOR_MOUSE_ID;}else{           if(rawEventLocal->value==KEYEVENT_ACTION_DOWN){rawEventLocal->deviceId=SENSOR_MOUSE_ID;rawEventLocal->flags=0;rawEventLocal->value=KEYEVENT_ACTION_DOWN;rawEventLocal->keyCode=0;rawEventLocal->code=SCANCODE_LEFT_MOUSE;rawEventLocal->type=1;rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;rawEventLocal[LOCAL_INDEX_SECOND].flags=0;rawEventLocal[LOCAL_INDEX_SECOND].code=0;rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;rawEventLocal[LOCAL_INDEX_SECOND].type=0;rawEventLocal[LOCAL_INDEX_SECOND].value=0;mTrueMouse=true;}   else if(rawEventLocal->value==KEYEVENT_ACTION_UP){rawEventLocal->deviceId=SENSOR_MOUSE_ID;rawEventLocal->flags=0;rawEventLocal->value=KEYEVENT_ACTION_UP;rawEventLocal->keyCode=0;rawEventLocal->code=SCANCODE_LEFT_MOUSE;rawEventLocal->type=1;rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;rawEventLocal[LOCAL_INDEX_SECOND].flags=0;rawEventLocal[LOCAL_INDEX_SECOND].code=0;rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;rawEventLocal[LOCAL_INDEX_SECOND].type=0;rawEventLocal[LOCAL_INDEX_SECOND].value=0;        mTrueMouse=false;}}    }            }}
#endifprocessEventsForDeviceLocked(deviceId, rawEvent, batchSize);} else {switch (rawEvent->type) {case EventHubInterface::DEVICE_ADDED:addDeviceLocked(rawEvent->when, rawEvent->deviceId);break;case EventHubInterface::DEVICE_REMOVED:removeDeviceLocked(rawEvent->when, rawEvent->deviceId);break;case EventHubInterface::FINISHED_DEVICE_SCAN:handleConfigurationChangedLocked(rawEvent->when);break;default:ALOG_ASSERT(false); // can't happenbreak;}}count -= batchSize;rawEvent += batchSize;}
}

这里做的工作就是:

1.

if(SENSOR_MOUSE_ID != deviceId && (classes & INPUT_DEVICE_CLASS_CURSOR))

先通过判断是否是鼠标设备。

如果是的话才做处理。

2.

if(!mPowerOn && rawEvent->type== EV_REL){//wake mouse for the first time
     mOktoMouseSure = false;//Allows you to convert the OK key to mouse left key
     mMousetoFocus = true;//unfade the cursor
     mPowerOn = true;// the first use of the mouse after system launch
    }

如果不处于开机状态,那么这时候收到一个rawEvent->type == EV_REL事件的时候

就要mPowerOn = true;以便后续根据这个变量点亮屏幕,达到按任意一个按键唤醒电视机的作用。

同时,第一次唤醒的时候,保持焦点模式。

3.

if(mWaitTime==0){
     mWaitTime=now;
    }else{
     if((now-mWaitTime)*0.000000001>15){
      if(rawEventLocal->code == SCANCODE_CENTER/*||rawEvent[1].scanCode==28*/){
       processEventsForDeviceLocked(deviceId, rawEventLocal, batchSize);
       mWaitTime=now;
       mMousetoFocus=false;//fade the cursor
       break;
      }else{
       if(rawEventLocal->type==EV_REL){//wake up the mouse  after sleep
        mOktoMouseSure = false;//Allows you to convert the OK key to mouse left key
        mMousetoFocus = true;//unfade the cursor
       }else if(rawEventLocal->code == SCANCODE_LEFT_MOUSE
        /*The left Key of Mouse of the Remote Controller*/
        ||rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_LEFT_MOUSE
        /*The left Key of  Any Mouse*/){
        mMousetoFocus=false;//fade the cursor
       }else{
        mOktoMouseSure=true;//Don't intercept the OK key
        mFlags = true;//Mark the mouse after dormancy
       }
      }
     }
     mWaitTime=now;    
    }

这段代码的意思是:

每次收到按键都更新mWaitTime为当前时间。如果这一次的按键离上一次操作的时间超过了15min,也就是进入休眠了。

这个时候,如果按enter键,隐藏鼠标。而如果收到鼠标事件,则mOktoMouseSure = false;这样允许将OK键转换成左键。

mMousetoFocus = true;唤醒鼠标。否则,mOktoMouseSure=true;不对OK键作转换。

这里的mFlags用于标记鼠标处于休眠状态

4.

if(mFlags && rawEventLocal->type==EV_REL){//The mouse be awakened first after dormancy
     mOktoMouseSure = false;//Allows you to convert the OK key to mouse left key
     mFlags = false;
     mMousetoFocus = true;//unfade the cursor
     //Change the current event into the eliminational focus event.
     removeFocusEventLocked(rawEventLocal, batchSize);
     break;
     }

这里就是针对鼠标的休眠状态做处理了,利用了前面的mFlags标记

5.

mTrueMouse,是用于标记是否对按键进行拦截的,我们只对down事件进行拦截和转换就可以了。

if(rawEventLocal->code == SCANCODE_LEFT_MOUSE
      ||rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_LEFT_MOUSE){  
      if(!mMousetoFocus){
       mMousetoFocus=true;//unfade the cursor
       mOktoMouseSure=false;//Allows you to convert the OK key to mouse left key
        ALOGD("get mouse left click!: deviceid %d scancode: %d", deviceId, rawEvent->code);
       //Change the current event into the eliminational focus event.
       removeFocusEventLocked(rawEventLocal, batchSize);
       break;
      }
     }

这里是对鼠标左键的处理。

6.

else if(rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_UP
      || rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_DOWN
      || rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_LEFT
      || rawEventLocal[LOCAL_INDEX_SECOND].code == SCANCODE_DPAD_RIGHT
      || rawEventLocal->code == SCANCODE_DPAD_UP
      || rawEventLocal->code == SCANCODE_DPAD_DOWN
      || rawEventLocal->code == SCANCODE_DPAD_LEFT
      || rawEventLocal->code == SCANCODE_DPAD_RIGHT
      /*The direction key of  Remote Controller in IR mode.*/
      ||(rawEventLocal->value>458830&&rawEventLocal->value<458835)
      /*The direction key of  Keyboard.*/){
         mMousetoFocus=false;//fade the cursor
      mOktoMouseSure = true;//Don't intercept the OK key
     }

这里就是实现对按任意方向键消隐鼠标的地方。

7.

if(!mMousetoFocus/* Drop The Cursor offset event of Mouse */){
      for(size_t s=0;s<batchSize;s++){       
       if(rawEventLocal[s].type == EV_REL){        
        isCursor = 1;        
        break;       
       }       
      }      
      if(isCursor){       
       for(size_t j=0 ; j<batchSize; j++){        
        rawEventLocal[j].deviceId = 0;       
        rawEventLocal[j].type =    -1;        
        rawEventLocal[j].code =    -1;        
        rawEventLocal[j].value =   -1;        
        rawEventLocal[j].keyCode = -1;        
        rawEventLocal[j].flags =   -1;        
        rawEventLocal[j].when =    -1;        
       }       
       isCursor = 0;     
      }
       }

这就是,如果鼠标处于消隐状态,那么丢掉所有鼠标位移的事件

8

最后就是重点了

对OK键的处理:

if(!mOktoMouseSure && !bEnablePointer){//The OK key is converted to the mouse left key

前面的很多逻辑都是标记mOktoMouseSure【OK键是否要转换成鼠标左键】,(bEnablePointer应该可以去掉)

这里就是实现OK键转换的逻辑了

if(rawEventLocal[LOCAL_INDEX_SECOND].code== SCANCODE_CENTER){
      deviceId=SENSOR_MOUSE_ID;
      if(rawEventLocal[LOCAL_INDEX_SECOND].value==KEYEVENT_ACTION_DOWN){
       rawEventLocal->deviceId=SENSOR_MOUSE_ID;
       rawEventLocal->flags=0;
       rawEventLocal->value=KEYEVENT_ACTION_DOWN;
       rawEventLocal->keyCode=0;
       rawEventLocal->code=SCANCODE_LEFT_MOUSE;
       rawEventLocal->type=1;
       rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;
       rawEventLocal[LOCAL_INDEX_SECOND].flags=0;
       rawEventLocal[LOCAL_INDEX_SECOND].code=0;
       rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;
       rawEventLocal[LOCAL_INDEX_SECOND].type=0;
       rawEventLocal[LOCAL_INDEX_SECOND].value=0;
       rawEventLocal[LOCAL_INDEX_THIRD].deviceId=SENSOR_MOUSE_ID;
       rawEventLocal[LOCAL_INDEX_THIRD].flags=0;
       rawEventLocal[LOCAL_INDEX_THIRD].code=0;
       rawEventLocal[LOCAL_INDEX_THIRD].keyCode=0;
       rawEventLocal[LOCAL_INDEX_THIRD].type=0;
       rawEventLocal[LOCAL_INDEX_THIRD].value=0; 
       mTrueMouse=true;
           } 
        else if(rawEventLocal[LOCAL_INDEX_SECOND].value==KEYEVENT_ACTION_UP){
       rawEventLocal->deviceId=SENSOR_MOUSE_ID;
       rawEventLocal->flags=0;
       rawEventLocal->value=KEYEVENT_ACTION_UP;
       rawEventLocal->keyCode=0;
       rawEventLocal->code=SCANCODE_LEFT_MOUSE;
       rawEventLocal->type=1;
       rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;
       rawEventLocal[LOCAL_INDEX_SECOND].flags=0;
       rawEventLocal[LOCAL_INDEX_SECOND].code=0;
       rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;
       rawEventLocal[LOCAL_INDEX_SECOND].type=0;
       rawEventLocal[LOCAL_INDEX_SECOND].value=0;    
       rawEventLocal[LOCAL_INDEX_THIRD].deviceId=SENSOR_MOUSE_ID;
       rawEventLocal[LOCAL_INDEX_THIRD].flags=0;
       rawEventLocal[LOCAL_INDEX_THIRD].code=0;
       rawEventLocal[LOCAL_INDEX_THIRD].keyCode=0;
       rawEventLocal[LOCAL_INDEX_THIRD].type=0;
       rawEventLocal[LOCAL_INDEX_THIRD].value=0; 
       mTrueMouse=false;
        }
     }
       else if(rawEventLocal->code== SCANCODE_CENTER/*The enter key / "OK" key event in IR mode*/){
        deviceId=SENSOR_MOUSE_ID;
        if(rawEventLocal->value==KEYEVENT_ACTION_REPEAT){
       mTrueMouse=true;
       break;
      }
      if(batchSize==4){
       rawEventLocal->deviceId=SENSOR_MOUSE_ID;
       rawEventLocal->flags=0;
       rawEventLocal->value=KEYEVENT_ACTION_DOWN;
       rawEventLocal->keyCode=0;
       rawEventLocal->code=SCANCODE_LEFT_MOUSE;
       rawEventLocal->type=1;
       rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;  
       rawEventLocal[LOCAL_INDEX_THIRD].deviceId=SENSOR_MOUSE_ID;
       rawEventLocal[LOCAL_INDEX_THIRD].flags=0;
       rawEventLocal[LOCAL_INDEX_THIRD].code=SCANCODE_LEFT_MOUSE;
       rawEventLocal[LOCAL_INDEX_THIRD].keyCode=0;
       rawEventLocal[LOCAL_INDEX_THIRD].type=1;
       rawEventLocal[LOCAL_INDEX_THIRD].value=KEYEVENT_ACTION_UP;
       rawEventLocal[3].deviceId=SENSOR_MOUSE_ID;
      }else{   
       if(rawEventLocal->value==KEYEVENT_ACTION_DOWN){
       rawEventLocal->deviceId=SENSOR_MOUSE_ID;
       rawEventLocal->flags=0;
       rawEventLocal->value=KEYEVENT_ACTION_DOWN;
       rawEventLocal->keyCode=0;
       rawEventLocal->code=SCANCODE_LEFT_MOUSE;
       rawEventLocal->type=1;
       rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;
       rawEventLocal[LOCAL_INDEX_SECOND].flags=0;
       rawEventLocal[LOCAL_INDEX_SECOND].code=0;
       rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;
       rawEventLocal[LOCAL_INDEX_SECOND].type=0;
       rawEventLocal[LOCAL_INDEX_SECOND].value=0;
       mTrueMouse=true;
           } 
        else if(rawEventLocal->value==KEYEVENT_ACTION_UP){
       rawEventLocal->deviceId=SENSOR_MOUSE_ID;
       rawEventLocal->flags=0;
       rawEventLocal->value=KEYEVENT_ACTION_UP;
       rawEventLocal->keyCode=0;
       rawEventLocal->code=SCANCODE_LEFT_MOUSE;
       rawEventLocal->type=1;
       rawEventLocal[LOCAL_INDEX_SECOND].deviceId=SENSOR_MOUSE_ID;
       rawEventLocal[LOCAL_INDEX_SECOND].flags=0;
       rawEventLocal[LOCAL_INDEX_SECOND].code=0;
       rawEventLocal[LOCAL_INDEX_SECOND].keyCode=0;
       rawEventLocal[LOCAL_INDEX_SECOND].type=0;
       rawEventLocal[LOCAL_INDEX_SECOND].value=0;  
       mTrueMouse=false;
        }
      } 
       }

其实就是对

rawEventLocal[LOCAL_INDEX_SECOND].code== SCANCODE_CENTER和rawEventLocal->code== SCANCODE_CENTER两种情况作处理。

(这里rawEventLocal有三组值,通过getevent我们可以看到,每按一个按键,是会有三个数据显示的,类似:

 # getevent/dev/input/event0: EV_MSC       MSC_SCAN             0000f00b
/dev/input/event0: EV_KEY       KEY_ENTER            DOWN
/dev/input/event0: EV_SYN       SYN_REPORT           00000000
/dev/input/event0: EV_KEY       KEY_ENTER            UP
/dev/input/event0: EV_SYN       SYN_REPORT           00000000

所以判断的时候,要针对DOWN事件的第二组值作处理。

那么问题来了。现在鼠标模式下在InputReader.cpp中将所有OK键进行了拦截转换成鼠标左键,以达到按OK键当鼠标左键的作用,那么Android系统中怎么样在视频播放这样一个场景下,不对OK键进行拦截呢?

结论:

这个问题还是当初的设计问题,如果决定在系统层将所有OK键转换成鼠标左键,那么自然上层所有的OK键都是起鼠标左键的效果。这个时候你又要求某一个第三方应用还是保留原来的OK键的效果,很明显是矛盾的。

如果要解决这个问题,只能是在视频全屏播放的时候,不开启空鼠模式!!java层获取到是否是视频播放状态,然后通过jni调用接口来操作C++层,这个方式可行,但是动作太大了。而且在系统层对单一场景特别处理显然不好。

视频播放的时候不拦截OK键相关推荐

  1. Toast的另类应用及另类“拦截”Home键

    我们都知道Toast的几种用法,像什么居中啊,添加图片显示啊等等.不过这里我要说的是能够全屏显示和永远不会消失的另类Toast.全屏显示和之前大家了解的居中有点类似,只要修改setGravity(in ...

  2. Flutter系列之showDialog拦截返回键

    Flutter中弹出对话框是使用showDialog函数,如果想拦截返回键,不想其点击返回键的时候消失, 就要嵌套一层WillPopScope,示例代码如下: showDialog(context: ...

  3. android4.2 拦截power键,Android 屏蔽Power键 Home键

    2014-04-18 17:22 1557人阅读 评论(0) 收藏 举报 分类: Android(46) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近正在处理工厂测试的功能,里面有个功能 ...

  4. Android变相拦截Home键,使app一直运行在前端

    首先,声明一下楼主不是流氓程序猿,也很痛恨流氓软件.主要是媳妇最近要考试,想让我写个程序把她手机锁一段时间,让她安心看书...好吧主观能动性太差的表现==.于是楼主就琢磨起来怎么能够实现这样的需求. ...

  5. android 拦截音量键,Android 音量键增大减小捕捉

    Android 音量键增大减小捕捉: @Override public boolean onKeyDown( int keyCode, KeyEvent event) { // TODO Auto-g ...

  6. Android拦截HOME键

    Android拦截按键 文章目录 Android拦截按键 Android拦截HOME按键 Android拦截BACK按键 Android拦截HOME按键 拦截HOME按键需要修改Android的fra ...

  7. ApiCloud拦截返回键

    api.addEventListener({name:"keyback" },function(ret,err){alert("点返回键了") })

  8. Android 拦截或屏蔽返回键

    在Android开发中我们常常会遇到需要拦截或屏蔽返回键的需求,对拦截后的返回键进行特殊操作. 监听返回键有两种方式 1.重写OnBackPressed方法 @Overridepublic void ...

  9. Android-完美解决在Activity中触摸返回键onBackPressed不能触发问题

    场景:在一个只有WebView组件的Activity中如何正确处理页面的返回? 之前思路是覆写Activity的onBackPressed方法,因为用户触摸"返回键"会触发该方法: ...

  10. Android下监听返回键、home键、任务键

    1.监听返回键 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYC ...

最新文章

  1. 吐槽: 移动端缓存策略
  2. 专线数据维护07/05
  3. 【ETL】ETL讲解(很详细!!!)
  4. python程序设计基础考试题库及答案_智慧职教Python程序设计基础题库及答案
  5. python中的递归函数是什么_讲解Python中的递归函数
  6. vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle
  7. mongoose和mongodb的几篇文章 (ObjectId,ref)
  8. arm64入栈出栈_【iOS内功】ARM黑魔法—栈桢的入栈和出栈
  9. 西瓜书+实战+吴恩达机器学习(十五)无监督学习之关联分析(Apriori, FP-growth)
  10. 计算机系统安装要点,电脑重新装系统要注意哪些要点 重装系统时的六大事项...
  11. MySQL 5.5 日志管理
  12. c#文件分割与合并 part 1 (转自互联网)
  13. 7.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 日志收集与分析
  14. Spring Boot 集成 RabbitMQ 升级
  15. STC8H8K系列汇编和C51实战——实现跑马灯(汇编版)
  16. dstwo linux 模拟器,dstwo md模拟器使用图文教程
  17. 微信小程序云开发源码(垃圾分类源码)
  18. 图像处理中的数学原理归类
  19. 百度富文本编辑jsp上传_类百度富文本编辑器文件上传。
  20. 优矿量化向导式因子选股

热门文章

  1. 花呗的24期利息计算器_花呗分期利息怎么算(附计算公式大全)
  2. 数据库变为可疑_数据库显示可疑的修复方法
  3. EmguCv模板匹配学习日记
  4. window下使用tail -f查看tomcat日志
  5. 北京联通 烽火光猫+烽火HG680 不拆机破解
  6. 【工具分享】分享一个移动端网络诊断工具(适用于安卓平台)
  7. ESP32-cam 初体验 从esp32-cam的购买到局域网监控的实现
  8. DirectX修复工具全部文件修复失败或下载失败的解决方法
  9. java代码反编译 工具下载及注意事项 xjad下载
  10. 异常数据剔除---格拉布斯准则(java实现)