java keypad game,Android 8.0 基于MTK平台 客制化/增加一个物理按键

前言:经过前三篇文章的学习,我们对Input子系统,按键的处理流程有个一个较为深刻的认识,那本篇文章就来学以致用吧。

主要解决以下工作任务:

在H6 医疗项目中,只有一个power键和添加了一个物理按键,

该按键功能是用于接听或者挂断电话,那么应该如何去客制化呢?

d4988d632e82?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

H6

1.查看GPIO对照表,配置DWS文件

d4988d632e82?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

GPIO对照表

一般来说,我们的按键需要通过col和raw来确定一个按键的位置,但也有另一种,就是raw接地了,只需配置col即可。

找硬件工程师拿到GPIO对照表和硬件原理图,从上表中可以看出需要客制化的GPIO引脚为84,对应的列COL0,GPIO81对应的ROW0为NC,也就是不需要设置行,另外,从硬件原理图中看出,按键的另一个引脚是接地的,因此不需要配置RAW。

路径:kernel-3.18/drivers/misc/mediatek/dws/mt6735/miki8735b_h6.dws

d4988d632e82?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

GPIO配置

2.Keypad_YuSu.cmp中添加新键,如CALLCONTROL快捷键

路径:kernel-3.18/tools/dct/old_dct/Keypad_YuSu.cmp

[Key_definition]

KEY_NONE

.

.

.

KEY_Y

KEY_Z

KEY_CALLCONTROL [添加新按键]

[Key_code]

0

228

.

.

.

21

44

254 [添加新按键对应的值 不要重复即可]

[Key_code_linux]

0

102

.

.

.

21

44

254 [添加新按键对应的值 不要重复即可]

[Power_Key_definition]

KEY_POWER

在[Key_definition]中最后的位置 添加 KEY_CALLCONTROL

然后[Key_code]和[Key_code_linux]最后的位置分别添加对应的值254

(这个值可以随便取,只要不和原生代码中的值重复即可,一般我们取原始值中最大的值+1即可)

3.打开DWS文件 在keypad矩阵中在相应定义的按键位中添加新按键

d4988d632e82?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

DWS文件修改

使用DrvGen.exe工具打开dws文件,在column0中添加CALLCONTROL,点击保存

除了kernel层,还要修改lk层和pl层,按照以上的步骤,修改以下所有文件

[kernel层]

kernel-3.18/tools/dct/old_dct/Keypad_YuSu.cmp

kernel-3.18/drivers/misc/mediatek/dws/mt6735/miki8735b_h6.dws

[preload层]

vendor/mediatek/proprietary/bootable/bootloader/preloader

/tools/dct/old_dct/Keypad_YuSu.cmp

vendor/mediatek/proprietary/bootable/bootloader/preloader

/custom/miki8735b_h6/dct/dct/codegen.dws

[lk层]

vendor/mediatek/proprietary/bootable/bootloader/lk

/scripts/dct/old_dct/Keypad_YuSu.cmp

vendor/mediatek/proprietary/bootable/bootloader/lk

/target/miki8735b_h6/dct/dct/codegen.dws

4.增加keypad layout文件键盘映射,linux和android key映射

android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件

关于kl文件更多资料:android kl文件

路径:

7.0:device/mikimobile/{$project}/mtk-kpd.kl

8.0:device/mediateksample/{项目名}/mtk-kpd.kl

//这里省略一些源码

key 165 MEDIA_PREVIOUS

key 168 MEDIA_REWIND

key 159 MEDIA_FAST_FORWARD

key 254 CALL_CONTROL [这里添加linux和android key的映射]

其中254 是linux键码,CALL_CONTROL 是android识别key值 如果是需要唤醒系统,还需要增加WAKE

5.修改Java识别keycode

frameworks/native/include/android/keycodes.h

/**

* Key codes.

*/

enum {

/** Unknown key code. */

AKEYCODE_UNKNOWN = 0,

//省略不跟源码

AKEYCODE_GESTURE_Z = 301,

AKEYCODE_GESTURE_HOME = 302

// NOTE: If you add a new keycode here

//you must also add it to several other files.

AKEYCODE_CALL_CONTROL = 303, //添加

};

在按键定义项增加 AKEYCODE_CALL_CONTROL = 303

frameworks/native/include/input/InputEventLabels.h

static const InputEventLabel KEYCODES[] = {

DEFINE_KEYCODE(GESTURE_HOME),

DEFINE_KEYCODE(HALL_ON),

DEFINE_KEYCODE(HALL_OFF),

DEFINE_KEYCODE(CALL_CONTROL), //Added

}

在KEYCODES数组中添加DEFINE_KEYCODE(CALL_CONTROL)

6.修改Java 键盘事件

frameworks/base/core/java/android/view/KeyEvent.java

public class KeyEvent extends InputEvent implements Parcelable {

public static final int KEYCODE_GESTURE_HOME = 300;

/** @hide */

public static final int KEYCODE_HALL_ON = 301;

/** @hide */

public static final int KEYCODE_HALL_OFF = 302;

/** @hide */

public static final int KEYCODE_CALL_CONTROL = 303; //Added

private static final int LAST_KEYCODE = KEYCODE_CALL_CONTROL;//modified

// NOTE: If you add a new keycode here you must also add it to:

//如果在这里添加了一个新的key,还必须将它添加到

// isSystem()

// isWakeKey()

// frameworks/native/include/android/keycodes.h

// frameworks/native/include/input/InputEventLabels.h

// frameworks/base/core/res/res/values/attrs.xml

// emulator?

// LAST_KEYCODE

//

}

public static final int KEYCODE_CALL_CONTROL = 303;

最后的按键为新增的

private static final int LAST_KEYCODE =KEYCODE_CALL_CONTROLS;

ps:

以上/**/注释的code是android 非开放API或变量定义的时候,需要添加Java Doc的识别,否则要运行make update-api才能build通过

如果是系统按键,修改frameworks/base/core/java/android/view/KeyEvent.java

isSystemKey()增加case KEYCODE_CALL_CONTROLS:

d4988d632e82?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

KeyEvent.java

如果是wake按键,修改

frameworks/base/core/java/android/view/KeyEvent.java

isWakeKey()增加case KEYCODE_CALL_CONTROLS:

d4988d632e82?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

KeyEvent.java

7.修改XML文件描述符framework/base/core/res/res/values/attr.xml

frameworks/base/core/res/res/values/attrs.xml

.

.

.

//添加以下代码

修改到这里,当我们点击电话按键时,就可以向上层上报数据了

使用adb命令查看

d4988d632e82?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

点击按键

这里的0xfe是十六进制->十进制为:254(linux code)

如果有上报这个值,说明我们添加新的按键成功了

最后就需要添加点击按键后去做什么事情的逻辑了

8.添加按键事件逻辑

frameworks/base/services/core/java/com/android

/server/policy/PhoneWindowManager.java

public long interceptKeyBeforeDispatching(WindowState win,

KeyEvent event, int policyFlags) {

//省略...代码

//Added for call_control begin

//在这里添加你的逻辑

case KeyEvent.KEYCODE_CALL_CONTROL: {

if (down) {/ / 判断按键按下

/ /获取电话服务

TelecomManager telecomManager = getTelecommService();

if (telecomManager != null) {/ /服务不为空

/ /如果电话响起

if (telecomManager.isRinging()) {

//接听电话

telecomManager.acceptRingingCall();

result &= ~ACTION_PASS_TO_USER;

}else if(telecomManager.isInCall()){

//如果正在通话 挂断电话

telecomManager.endCall();

result &= ~ACTION_PASS_TO_USER;

}

}

}

break;

}

//end Added for call_control

case KeyEvent.KEYCODE_VOICE_ASSIST: {

//省略代码

}

到此,我们新增按键的客制化就完成了。

Stay hungry,Stay foolish!

荆轲刺秦王

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值