按计划每周更新一篇技术博文,第五篇:《
Android基于Socket无线遥控(2)--无线控制篇》
本篇主要内容涉及模拟系统按键消息,单击事件,触屏事件等,模拟Android系统按键参考了网上资料(见引用1),无线遥控收发信息部分和上节所讲内容一样。
一、技术介绍
1.模拟按键及触屏相关
模拟按键和触摸屏需要调用SDK内部隐藏方法,在WindowManagerService中实现UI交互的注入方法,但可惜WindowManagerService这个类是被标记了@hide,外部不能使用,不然恶意程序就随意控制Android设备了。
在WindowManagerService类中,按键和触屏消息的方法如下:
- // Injects a keystroke event into the UI.
- public boolean injectKeyEvent(KeyEvent ev, boolean sync){
- ...
- }
- // Inject a pointer (touch) event into the UI.
- public boolean injectPointerEvent(MotionEvent ev, boolean sync) {
- ...
- }
更进一步可以搜素相关资料,这里涉及到Binder,还有AIDL(
Android接口描述语言),这些内容真要弄明白还需要花些时间,大概作用就是跨进程之间的数据通讯,Binder更是在Java层与C++层之间的数据传输起到很大作用。在Android源码中随处可见,因为实际项目中很少使用,之前看过的内容很快就忘记了。
WindowManagerService类就是IWindowManager.Stub的实现类,在内部程序中使用如下:
- // 模拟触摸消息
- private static void sendPointerSync(MotionEvent event) {
- try {
- (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectPointerEvent(event, true);
- } catch (RemoteException e) {}
- }
- // 模拟按键消息
- private static void sendKeySync(KeyEvent event) {
- try {
- (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectKeyEvent(event, true);
- } catch (RemoteException e) {}
- }
2.常见按键消息
Key | Constant Value
Back 4
Power 26
Menu 82
Home 3
Search 84
方向键:
上 19
下 20
左 21
右 22
确认(类似单击):23
音量键:
音量减 25
音量加 24
更详细的KeyEvent请点击:
http://developer.android.com/reference/android/view/KeyEvent.html
二、为Android系统添加模拟按键对外接口
步骤一:在Android源码中传建新扩展模块目录
在源码的frameworks/base/cmds下传建一个文件夹,本例文件夹命名【analog_control】,在此目录下可存放用java或C编写的可运行程序。
步骤二:编写模拟按键相关代码
在步骤一所创建的目录下新建一个AnalogControl.java文件,编写程序代码,在此你可以使用IWindowManager类,本例需要模拟按键key,长按键keypress,点触笔touch,点触笔长按touchpress,以及移动move等。(本例代码使用引用1的代码)
- import android.view.MotionEvent;
- import android.view.KeyEvent;
- import android.view.IWindowManager;
- import android.os.ServiceManager;
- import android.os.SystemClock;
- import android.os.RemoteException;
- import android.util.Log;
- public class AnalogControl {
- public static void main(String args[])throws