赞
踩
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
在public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {方法中处理按键
加入
- StringLED_PATH ="/sys/class/leds/keyboard-backlight/brightness";
- if(keyCode !=KeyEvent.KEYCODE_VOLUME_UP && keyCode != KeyEvent.KEYCODE_VOLUME_DOWN
- && keyCode !=KeyEvent.KEYCODE_VOICE_ASSIST && keyCode !=KeyEvent.KEYCODE_TV_DATA_SERVICE && keyCode !=KeyEvent.KEYCODE_TV_RADIO_SERVICE ){
- if(down){
- mHandler3.removeMessages(0);
- controlBrightness("1",LED_PATH);
- }else if (event.getAction() ==KeyEvent.ACTION_UP){
- mHandler3.postDelayed(new Runnable() {
- public void run() {
- controlBrightness("0",LED_PATH);
- }
- }, 3000);
- }
- }
所需方法
- privatevoid controlBrightness(String commod,String Path) {
- BufferedWriter bufWriter;
- try {
- bufWriter = new BufferedWriter(newFileWriter(Path));
- bufWriter.write(commod);
- bufWriter.close();
- } catch (IOException e) {
- Log.e("KeyboardLight"," ***controlRedBrightness ERROR*** Here is what I know:"
- + e.getMessage());
- e.printStackTrace();
- }
- }
-
- 导包import java.io.BufferedWriter;
- importjava.io.FileWriter;
- importjava.io.IOException;
新开一个mHandler3,避免之前的mHandler已经移除了消息或执行了什么消息。
这里面是去掉了一些侧键和音量键,通过写底层键盘灯节点的方式进行
这个节点需要写权限,
开放底层节点操作所需权限和se权限,这里以键盘灯和音量旋钮节点为例
首先先在device/droi/pl2281_zrk/init.project.rc
开放上层节点操作权限,加入
- chownsystem system /sys/devices/platform/rotary_pwr/rotary_power
- chmod 666/sys/devices/platform/rotary_pwr/rotary_power
-
- chmod 666/sys/class/leds/keyboard-backlight/brightness
- chown system system/sys/class/leds/keyboard-backlight/brightness
这里的路径其实是软路径,并不代表就一定是底层真实路径,不过上层就可以用这个来操作了,此时还有SeLinux权限需要开放,会报avc权限问题
在
device/mediate/目录下,当然在device/droi下面也行
sepolicy/basic/non_plat/file.te定义需要开放节点的名称
- +#ledkeyborad
- +type sysfs_leds_keyboradlight,fs_type, sysfs_type, mlstrustedsubject;
- +type sysfs_rotary_status,fs_type, sysfs_type, mlstrustedsubject;
注意sysfs_leds_keyboradlight这个名称前面的sysfs_是固定的,后面自定义名称,有点类似SystemProperties.get("persist.sys.packageinstall.status","0"))
后面的fs_type,sysfs_type, mlstrustedsubject 就是固定格式让他作为系统可开放的类型
然后在sepolicy/basic/non_plat/file_contexts
匹配对应真实路径
- +#led keyborad
- +/sys/devices/platform/leds-mt65xx/leds/keyboard-backlight/brightnessu:object_r:sysfs_leds_keyboradlight:s0
- +/sys/devices/platform/rotary_pwr/rotary_statusu:object_r:sysfs_rotary_status:s0
这里就是真实路径,然后这个格式固定u:object_r:sysfs_leds_keyboradlight:s0
替换名称就行,就是规定se规则到这个节点为false,跳过
有些节点没有软路径就是真实路径,比如这里的旋钮节点,但是键盘灯节点就有这个底层真实路径,结合之前的状态灯节点也同理,
查看节点的真实路径,adbshell 后su模式
ls –l 上层应用节点 看看是否有指向真实路径
最后就是真正执行这节点开放的是
sepolicy/basic/non_plat/system_server.te
- +#led keyborad
- +allow system_server sysfs_leds_keyboradlight:dirsearch;
- +allow system_server sysfs_leds_keyboradlight:filerw_file_perms;
- +allow system_server sysfs_rotary_status:filerw_file_perms;
就是开放正常的读写权限,注意这边键盘灯操作是在framework层调用,最后报的也是system_server给的avc不足,反之如果是系统apk或者内置的应用需要权限的话
就在
sepolicy/basic/non_plat/system_app.te
加入,就是换一个类型system_app
- +#led keyborad
- +allow system_appsysfs_leds_keyboradlight:dir search;
- +allow system_appsysfs_leds_keyboradlight:file rw_file_perms;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。