android升级功能键,Android 按键添加转载

按键从Linux到Android

现在的普通按键也集成到Linux Input子系统中了,只需要把按键对应的IO端口配置好,按键就可以工作了。所以一般提供的BSP(或者叫作解决方案)中,已经完善了按键驱动。关键是快速的了解按键的映射。所以这里不作源码级分析。源码分析可以参考这里:《基于S3C2440的Linux-3.6.6移植——按键驱动》

Linux按键的扫描码

扫描码是Linux Input系统中规定的码值,好比PC键盘上每个键的键值。都是数字。

在设备上输入一下命令后,按键可以探测到得到每个按键的扫描码Code.

root@android:/ # busybox hexdump /dev/input/event0  (20141009更:同样可以使用Android中专用的getevent命令)

0b1093df9dbaca3a5b39d218cf435c37.png

Android 与 Linux分隔线

Android也定义了一套码,叫作键盘码,通过一个/system/usr/keylayout/来将两套码对应起来。目前调试的是全志的A10的BSP包。这里用的是sun4i-keyboard.kl。(如果没有其它*.kl,则是默认的qwerty.kl)

Linux上传的Code是0x00d9对应10进制217,打开sun4i-keyboard.kl后可以看到映射关系:

beb4cf8c058266481d68cbad67c8e21c.png

可以看出对应的是BRIGHTNESS_DOWN,Android中只认BRIGHTNESS_DOWN(这里成为字串),Linux中的Code至此为止。  (在Android源码中也能找到这个映射文件可以依名字搜索找到其位置)

Android源码中添加该按键

如果Android中frameworks/base/core/java/android/view/KeyEvent.java有要添加的功能,比如HOME,则只修改*.kl映射按键即可修改或者添加映射。

如果KeyEvent.java中本没有要添加按键的功能,就可以在KeyEvent.java的KeyEvent类最后依葫芦画瓢添加:

如不知道功能的键盘码是多少可以到这里找到。

然后根据KeyEvent类最后的添加键提示,每个文件都添加上:

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

//  isSystem()

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

//  frameworks/base/include/ui/KeycodeLabels.h

//  external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h

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

//  emulator?

//  LAST_KEYCODE

//  KEYCODE_SYMBOLIC_NAMES

//

//  Also Android currently does not reserve code ranges for vendor-

//  specific key codes.  If you have new key codes to have, you

//  MUST contribute a patch to the open source project to define

//  those new codes.  This is intended to maintain a consistent

//  set of key code definitions across all Android devices.

添加后,Android应用程序就可以通过onKeyDown检测到了检测到这个按键了。至于这个按键具体功能的实现比如这里的

BRIGHTNESS_DOWN(亮度减)功能,要修改frameworks/base/policies/base/phone/com

/android/internal/policy/impl/PhoneWindowManager.java。根据具体需求实现。

关于重启(Reset)键

这个“按键”一般是通过直接连接CPU芯片上的复位实现重启功能的。这个直接操作的是CPU,Android(或者Linux)是无法去检测和控制这个“按键”的。

20140306更新:

今天再次遇到同样的问题,为Android添加按键。平台是rk30,Android版本是4.2.2。遇到了一些新问题和新的挑战,花费一天时间添加完毕。且做了完整的规划。以CAMERA和OTHAER键为例。

1.确认内核层的键值码

进入adb shell,使用toolbox中的getevent工具:type code value。主要看type为1时的code值是多少。

2.确认*.kl文件

确认方法是交换V+和V-的键值码,结果是:自定义:rk29-keypad.kl,一般键盘是:Generic.kl,qwerty.kl已经被Generic.kl取代。

3.确认如何修改*.kl会起效

重启后

4.确认两个kl区别

从里边内容可以大概分别出来rk29-keypad.kl决定新添加的,Generic.kl包含了所有的键,优先级低于rk29-keypad.kl,也就是两个kl文件可以同定义一个键值,但会以rk29-keypad.kl首先为准(如果rk29-keypad.kl中定义了,但是字串Android层没有处理比如”key 114   FUCK”,”FUCK”上层并没有处理,还是会去处理Generic.kl中的对应键串),所以新添加的键值都添加到rk29-keypad.kl中,Generic.kl是建议不动的。

注意事项:kl定义的键串必须是Android层进行处理的,如果有出现没有处理的键串会导致整个键盘都不能使用。如果是键盘只会读Generic.kl,而不会读rk29-keypad.kl。所以如果是一个特殊的键盘,那么要动手修改Generic.kl。这个是实践结果,具体源码还没有找到。

5.先打通一个已经半通的CAMERA

CAMERA是上层已经完善的,在kl文件将新按键映射到的CAMERA上(key 132 CAMERA),然后用一个apk来验证接收。结果OK。

6.打通整个通道-添加OTHER键值

在添加过程中还参考了篇文章《Android4.1添加新的按键(3)》,这里记录4.2.2中具体修改了哪些文件:

external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h

frameworks/base/api/current.txt

frameworks/base/core/java/android/view/KeyEvent.java(两处)

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

frameworks/base/data/keyboards/Generic.kl

frameworks/base/include/androidfw/KeycodeLabels.h

frameworks/base/libs/androidfw/Input.cpp

frameworks/native/include/android/keycodes.h

其中current.txt是在添加其它文件后执行make update-api编译自动修改的结果。关于Android上层在哪里解析的这个两个kl文件,要等下次更新了。

20140315更新:

很快又用到这里的信息,今天是添加一个红外遥控的键值,结果也得修改Generic.kl,修改rk**.kl不行。就简单的记录到这里。

20141010更新:

Android上层也在不断的更新,4.0/4.2的时候亮度的调节还是要自己添加按键来实现,4.4中KeyEvent.java已经有了这两个按键键值,对应Generic.kl中已经已经有了对应到Linux内核的标准亮度调试键值。

529e45aa61fe1fb27bc1e9bf3a6b132c.png

d8073c65a2cc2177afe79f2ae3ab91e9.png

From:

不仅可以验证内核发出的输入事件,同样不可以模拟输入事件到Android上层。如下命令模拟「亮度减」的按键。

$ adb shell input keyevent BRIGHTNESS_DOWN

执行后就可以Android系统可以响应出来 调整亮度。就可以说明Android上层已经畅通无阻了。

根据以上分析,那么在Android4.4中配置内核中只上报标准的内核亮度键值KEY_BRIGHTNESSDOWN/KEY_BRIGHTNESSUP就可以正常的对接了。

但是我同样遇到了亮度按键不能响应的问题,通过上下观察值都对应上去的,但是却不能正常响应。

经实验,将如下「亮度键值」添加到rk29-keypad.kl中可以正常响应了:

key 224   BRIGHTNESS_DOWN

key 225   BRIGHTNESS_UP

事后根据Android官方教程Key Layout Files分析它会优先读取/system/usr/keylayout/DEVICE_NAME.kl按键映射文件。而设备上的物理按键的设备名正好是「rk29-keypad」,可以通过getevent查看出来。

这也解释了20140315添加红外遥控器的键值时不能添加到rk29-keypad.kl中,而添加到Generic.kl可以正常。因为Generic.kl的属于fallback级别的映射文件。针对遥控器正确的方法同样新建立一个DEVICE_NAME.kl的映射文件。比如遥控器设备名为rkxx-remotectl那么新建一个rkxx-remotectl.kl映射文件,内容是和Generic.kl中类似的每个键值对应的键码。这个方法要远比直接修改Generic.kl文件要好的多了。

其实同样也有了新的疑问,如果DEVICE_NAME.kl中没有声明的键值,那么就不会去Generic.kl中查找,这点我是有点自己的建议的,应该像字库一样,在相应的字库中查找不到的字都到fallback字体中查找一下。

20141018更新:

Keylayout文件中所有的「字串」必须在当前版本系统的源码的类中存在。否则系统会认为该Keylayout是无效的。所以可以添加Keylayout和添加「字串」到KeyEvent要同步进行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android按键广播是指在Android系统中,当用户在设备上按下按键时,系统会通过广播的形式发送一个按键事件给应用程序。应用程序可以通过注册接收器来监听这些按键广播,从而进行相应的处理。 Android提供了一个名为KeyEvent的类来表示按键事件。该类包含了按下按键的键码和键标志等信息。通过监听按键广播,应用程序可以根据具体的按键事件做出相应的操作。 为了接收按键广播,应用程序需要在AndroidManifest.xml文件中注册一个接收器,并指定接收的广播类型为"android.intent.action.KEYCODE"。在接收器中,可以重写onReceive方法,该方法会在接收到按键广播时被调用。 例如,当用户按下音量键时,系统会发送ACTION_VOLUME_CHANGED广播。应用程序可以在接收器中注册对该广播的监听,并在接收到广播时执行相应的逻辑,例如调整音量大小。 使用按键广播可以实现很多功能,例如在游戏中监听用户的按键操作,实现游戏控制;或者在媒体播放器中监听用户的音量键按下事件,实现音量调节。 总之,Android按键广播提供了一种机制,让应用程序能够响应用户的按键操作。通过注册接收器并监听相应的广播,应用程序可以根据按键事件做出相应的处理,从而提升用户体验。 ### 回答2: Android 按键广播是指在Android系统中,当用户在设备上按下物理按键时,系统会发送相应的广播通知应用程序。通过接收这些广播,应用程序可以捕获按键事件,并根据需要进行相应的处理。 Android系统通过Intent来实现按键广播的传递。每个按键事件都会关联一个特定的Intent,并通过广播传递给应用程序。应用程序可以通过注册广播接收器来监听这些按键广播,在接收到相应广播时执行相应的逻辑。 在Android中,常见的按键广播包括: 1. ACTION_DOWN:当按键被按下时发送的广播。应用程序可以通过监听这个广播来捕获按键按下的事件响应。 2. ACTION_UP:当按键被释放时发送的广播。应用程序可以通过监听这个广播来捕获按键释放的事件响应。 3. ACTION_MULTIPLE:当按键被长时间按住并持续产生输入字符时发送的广播。 除了以上的基本按键广播,Android系统还提供了一些特定的按键广播,例如: 1. ACTION_MEDIA_BUTTON:用于媒体播放控制的按键广播,例如音量键、媒体控制键等。 2. ACTION_CAMERA_BUTTON:用于相机控制的按键广播,例如相机快门键。 我们可以通过在应用程序中注册BroadcastReceiver来监听某个特定的按键广播。当接收到对应广播时,我们就可以在广播接收器的onReceive()方法中编写相应的逻辑代码,例如改变UI界面、执行特定动作等。 总之,Android按键广播是一种通过发送广播通知应用程序的方式,来捕获和处理用户按键事件的方法。它能够实现按键与应用程序的交互,为用户提供更好的按键体验。 ### 回答3: Android按键广播是指在Android系统中,当用户按下设备上的硬按键(如返回键、菜单键、音量键等)时,系统会发送对应的广播消息,应用程序可以通过注册广播接收器来监听这些按键事件。通过捕获按键广播,可以在应用程序中做出相应的处理,例如在按下返回键时执行特定的操作。 开发者可以通过注册BroadcastReceiver并监听相关的Intent来接收按键广播。常见的按键广播Intent有ACTION_DOWN和ACTION_UP,分别表示按键按下和松开的事件。通过在BroadcastReceiver中重写onReceive()方法,开发者可以编写处理按键事件的逻辑。 在接收到按键广播后,开发者可以根据需要进行不同的处理。例如,当用户按下返回键时,可以确认用户是否希望退出应用程序,如果是,则执行退出操作;如果不是,则可以忽略该按键事件。另外,也可以根据不同的按键响应特定的功能,如音量键控制音量大小,菜单键打开菜单等。 需要注意的是,Android系统并不允许修改一些特定按键的默认行为,只能对按键事件进行监听和处理,而不能改变按键的功能。同时,不同的设备可能会有不同的按键布局和功能,因此开发者需要根据具体的设备进行适配处理。 总结来说,Android按键广播是一种方便开发者监听和处理按键事件的机制。通过注册广播接收器,并根据需要编写相应的逻辑,开发者可以自定义在应用程序中按下不同硬按键时的行为。这样,可以提供更好的用户体验并增加应用程序的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值