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文章来源:https://www.toymoban.com/news/detail-800879.html
加入,就是换一个类型system_app文章来源地址https://www.toymoban.com/news/detail-800879.html
+#led keyborad
+allow system_appsysfs_leds_keyboradlight:dir search;
+allow system_appsysfs_leds_keyboradlight:file rw_file_perms;
到了这里,关于键盘灯功能。开放底层节点操作所需权限和se权限。avc权限问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!