视频播放的时候不拦截OK键
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键相关推荐
- Toast的另类应用及另类“拦截”Home键
我们都知道Toast的几种用法,像什么居中啊,添加图片显示啊等等.不过这里我要说的是能够全屏显示和永远不会消失的另类Toast.全屏显示和之前大家了解的居中有点类似,只要修改setGravity(in ...
- Flutter系列之showDialog拦截返回键
Flutter中弹出对话框是使用showDialog函数,如果想拦截返回键,不想其点击返回键的时候消失, 就要嵌套一层WillPopScope,示例代码如下: showDialog(context: ...
- android4.2 拦截power键,Android 屏蔽Power键 Home键
2014-04-18 17:22 1557人阅读 评论(0) 收藏 举报 分类: Android(46) 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近正在处理工厂测试的功能,里面有个功能 ...
- Android变相拦截Home键,使app一直运行在前端
首先,声明一下楼主不是流氓程序猿,也很痛恨流氓软件.主要是媳妇最近要考试,想让我写个程序把她手机锁一段时间,让她安心看书...好吧主观能动性太差的表现==.于是楼主就琢磨起来怎么能够实现这样的需求. ...
- android 拦截音量键,Android 音量键增大减小捕捉
Android 音量键增大减小捕捉: @Override public boolean onKeyDown( int keyCode, KeyEvent event) { // TODO Auto-g ...
- Android拦截HOME键
Android拦截按键 文章目录 Android拦截按键 Android拦截HOME按键 Android拦截BACK按键 Android拦截HOME按键 拦截HOME按键需要修改Android的fra ...
- ApiCloud拦截返回键
api.addEventListener({name:"keyback" },function(ret,err){alert("点返回键了") })
- Android 拦截或屏蔽返回键
在Android开发中我们常常会遇到需要拦截或屏蔽返回键的需求,对拦截后的返回键进行特殊操作. 监听返回键有两种方式 1.重写OnBackPressed方法 @Overridepublic void ...
- Android-完美解决在Activity中触摸返回键onBackPressed不能触发问题
场景:在一个只有WebView组件的Activity中如何正确处理页面的返回? 之前思路是覆写Activity的onBackPressed方法,因为用户触摸"返回键"会触发该方法: ...
- Android下监听返回键、home键、任务键
1.监听返回键 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYC ...
最新文章
- 吐槽: 移动端缓存策略
- 专线数据维护07/05
- 【ETL】ETL讲解(很详细!!!)
- python程序设计基础考试题库及答案_智慧职教Python程序设计基础题库及答案
- python中的递归函数是什么_讲解Python中的递归函数
- vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle
- mongoose和mongodb的几篇文章 (ObjectId,ref)
- arm64入栈出栈_【iOS内功】ARM黑魔法—栈桢的入栈和出栈
- 西瓜书+实战+吴恩达机器学习(十五)无监督学习之关联分析(Apriori, FP-growth)
- 计算机系统安装要点,电脑重新装系统要注意哪些要点 重装系统时的六大事项...
- MySQL 5.5 日志管理
- c#文件分割与合并 part 1 (转自互联网)
- 7.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 日志收集与分析
- Spring Boot 集成 RabbitMQ 升级
- STC8H8K系列汇编和C51实战——实现跑马灯(汇编版)
- dstwo linux 模拟器,dstwo md模拟器使用图文教程
- 微信小程序云开发源码(垃圾分类源码)
- 图像处理中的数学原理归类
- 百度富文本编辑jsp上传_类百度富文本编辑器文件上传。
- 优矿量化向导式因子选股