android 关联按键和坐标,android输入系统之TP报按键和报坐标时对下面功能键的处理...

本文解析了如何在Android系统源码中修改PhoneWindowManager.java,以添加对非虚拟按键的支持,如特殊功能键的马达震动和按键灯响应。通过拦截关键事件并自定义策略,解决了海尔HC54XX系列设备上功能键反馈问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android 输入系统

1、 ap-srcframeworksbasecorejavaandroidView KeyEvent.java :定义了android输入系统框架层的各种事件、键值等。

2、 ap-srcframeworksbasecorejavaandroidView WindowManagerPolicy.java :定义了android输入系统对输入事件、按键等的处理策略标志等。比如FLAG_VIRTUAL :处理虚拟按键的策略标志。

3、 ap-srcframeworksbasecorejavaandroidView HapticFeedbackConstants.java :定义了android输入系统对输入事件,如按键的反馈标志,比如,按下按键时,就会置位KEYBOARD_TAP ,而按下虚拟按键则是置位VIRTUAL_KEY。这样在检测到这些反馈标志后就会调用指定的反馈函数,如按下HOME键,调用点亮按键灯和马达震动函数。

4、 ap-srcframeworksbasepolicysrccomandroidinternalpolicyImpl PhoneWindowManager.java :android主窗口,主界面控制总调用程序,这个就是我们在开机后看到的主界面了,在这里面会调用其它的一些服务。比如打电话,按下HOME键时,回到主界面,调用按键灯服务和马达服务等。

5、应用实例 :在调试海尔HC54XX系列触摸屏的时候,由于下面4个功能键是使用特殊方法实现,即在该区域不会报坐标,但是按下相应的按键时会报一个特殊值,这样在根据这个特殊值再转换为报按键事件,虽然实现了特殊功能键的功能,但是在按键的时候,马达和按键灯都不起作用。这是因为android在PhoneWindowManager.java中只对虚拟按键做了马达和按键灯的反馈处理,但是直接报按键的没有这样处理,因此要实现直接报按键也要有这个功能就必须在PhoneWindowManager.java这里面添加对应的处理。我的方法是在PhoneWindowManager.java中的public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) 函数中添加对直接报按键的处理:

interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn){

final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;

final int keyCode = event.getKeyCode();

//add by Andy.jiang to use MENU HOME BACK SEARCH key event to open the led and vibrator start

if((keyCode==KeyEvent.KEYCODE_MENU)||(keyCode== KeyEvent.KEYCODE_HOME)||

(keyCode==KeyEvent.KEYCODE_BACK)||(keyCode== KeyEvent.KEYCODE_SEARCH)){

policyFlags |= WindowManagerPolicy.FLAG_MENU;//标志下面4个功能键按下

}

if (down && (policyFlags & WindowManagerPolicy.FLAG_MENU) != 0){

try {

mLight.turnOnButtonLightOneShot();//点亮按键灯

Slog.e("hc54xx", "function key for turn on button light ok.");

} catch(RemoteException e) {

Slog.e(TAG, "function key for turn on button light failed.");

}

performHapticFeedbackLw(null, HapticFeedbackConstants.KEYBOARD_TAP, false);//调用马达震动

}

//add by Andy.jiang to use MENU HOME BACK SEARCH key event to open the led and vibrator end

其中函数performHapticFeedbackLw()原型是:也在PhoneWindowManager.java中

public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always) {

if (effectId == HapticFeedbackConstants.VIRTUAL_KEY) {

// Click home menu search back button, in this time effectId == VIRTUAL_KEY, LED should be lighted.

// Seprate LED control from haptic control.

// when effectId == HapticFeedbackConstants.VIRTUAL_KEY, should turnOnButtonLightOneShot.

// turnOnButtonLightOneShot() will contorl LED brightness and diaplay time.

try {

mLight.turnOnButtonLightOneShot();

} catch(RemoteException e) {

Slog.e(TAG, "remote call for turn on button light failed.");

}

}

final boolean hapticsDisabled = Settings.System.getInt(mContext.getContentResolver(),

Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0;

if (!always && (hapticsDisabled || mKeyguardMediator.isShowingAndNotHidden())) {

return false;

}

long[] pattern = null;

switch (effectId) {

case HapticFeedbackConstants.LONG_PRESS:

pattern = mLongPressVibePattern;

break;

case HapticFeedbackConstants.VIRTUAL_KEY:

pattern = mVirtualKeyVibePattern;

break;

case HapticFeedbackConstants.KEYBOARD_TAP:

pattern = mKeyboardTapVibePattern;

break;

case HapticFeedbackConstants.SAFE_MODE_DISABLED:

pattern = mSafeModeDisabledVibePattern;

break;

case HapticFeedbackConstants.SAFE_MODE_ENABLED:

pattern = mSafeModeEnabledVibePattern;

break;

default:

return false;

}

if (pattern.length == 1) {

// One-shot vibration

mVibrator.vibrate(pattern[0]);

Slog.e("hc54xx", "function key for turn on vibrator.");//add by Andy

} else {

// Pattern vibration

mVibrator.vibrate(pattern, -1);

Slog.e("hc54xx", "function key for turn off vibrator.");//add by Andy

}

return true;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值