某公司的产品中,有一个在触摸屏上叫做手电筒的按键。我的工作就实现这样一件事情:通过手电筒按键控制闪光灯的亮灭。在android系统上做这么一个东西没有什么思路啊。
于是google一下,发现以下链接一个 ,参考这个链接就会明白设置流程,就不细说了,链接在文章后面给出。
目标:通过手电筒按键控制闪关灯亮灭。
已有资源:驱动部分,驱动工程师已经做好,并且提供了通过读写一个state的文件方法来点亮灯。
cat xxx/state //查看灯的亮灭状态
echo "torch" > xxx/state //点灯
echo "off" > xxx/state //灭灯
下面是我在android4.0.4系统源码修改的文件清单:
frameworks/base/include/ui/KeycodeLabels.h
frameworks/base/native/include/android/keycodes.h
frameworks/base/libs/ui/Input.cpp
frameworks/base/core/res/res/values/attrs.xml
frameworks/base/data/keyboards/Generic.kl
frameworks/base/core/java/android/view/KeyEvent.java
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
1、修改指定的文件后,执行make update-api。
2、编译系统,烧写镜像。
具体每一个修改的介绍,我就不详细介绍了,主要是免去大家修改4.0.4系统的时候,不用再去找具体的修改文件位置。在这里我主要详细介绍一下java中使用重定位部分。
java中使用exec来实现执行shell命令,但是执行ls这些命令还比较简单,执行我上述所给出的命令可能就要花点功夫去弄了。我是说对于像我这种java基础不太好的人,java大神请勿喷。
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
。。。
else if (keyCode == KeyEvent.KEYCODE_GPS){
System.out.println("######press gps");
if (down && repeatCount == 0) {
try {
Process p;
BufferedReader br;
InputStreamReader isr;
FileInputStream is;
String state;
File file = new File("/sys/class/camera_led/ctrl/state");
is = new FileInputStream(file);
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
state = br.readLine();
if(state.toString().equals("off")){
p = Runtime.getRuntime().exec("sh");
String cmd1 = new String("echo \"torch\" > /sys/class/camera_led/ctrl/state\n");
p.getOutputStream().write(cmd1.getBytes());
p.getOutputStream().flush();
}
else {
p = Runtime.getRuntime().exec("sh");
String cmd1 = new String("echo \"off\" > /sys/class/camera_led/ctrl/state\n");
p.getOutputStream().write(cmd1.getBytes());
p.getOutputStream().flush();
}
br.close();
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
}else if (keyCode == KeyEvent.KEYCODE_MENU) {
// Hijack modified menu keys for debugging features
final int chordBug = KeyEvent.META_SHIFT_ON;
。。。
}
参考文章:http://blog.csdn.net/acm2008/article/details/7065546