Android基于Socket无线遥控(2)--模拟触摸按键篇

本文详细介绍了如何通过Android的Socket实现无线遥控,模拟触摸按键和按键事件,包括ACTION_DOWN、ACTION_UP等,以及如何通过Shell命令执行模拟操作。
摘要由CSDN通过智能技术生成
按计划每周更新一篇技术博文,第五篇:《 Android基于Socket无线遥控(2)--无线控制篇

  本篇主要内容涉及模拟系统按键消息,单击事件,触屏事件等,模拟Android系统按键参考了网上资料(见引用1),无线遥控收发信息部分和上节所讲内容一样。

一、技术介绍
1.模拟按键及触屏相关
    模拟按键和触摸屏需要调用SDK内部隐藏方法,在WindowManagerService中实现UI交互的注入方法,但可惜WindowManagerService这个类是被标记了@hide,外部不能使用,不然恶意程序就随意控制Android设备了。
    在WindowManagerService类中,按键和触屏消息的方法如下:
[java]  view plain copy
  1. // Injects a keystroke event into the UI.  
  2. public boolean injectKeyEvent(KeyEvent ev, boolean sync){  
  3. ...  
  4. }  
  5.   
  6. //  Inject a pointer (touch) event into the UI.  
  7. public boolean injectPointerEvent(MotionEvent ev, boolean sync) {  
  8. ...  
  9. }  

    更进一步可以搜素相关资料,这里涉及到Binder,还有AIDL( Android接口描述语言),这些内容真要弄明白还需要花些时间,大概作用就是跨进程之间的数据通讯,Binder更是在Java层与C++层之间的数据传输起到很大作用。在Android源码中随处可见,因为实际项目中很少使用,之前看过的内容很快就忘记了。
    WindowManagerService类就是IWindowManager.Stub的实现类,在内部程序中使用如下:
[java]  view plain copy
  1. // 模拟触摸消息  
  2.   
  3. private static void sendPointerSync(MotionEvent event) {  
  4. try {  
  5. (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectPointerEvent(event, true);  
  6. catch (RemoteException e) {}  
  7. }  
  8.   
  9. // 模拟按键消息  
  10.   
  11. private static void sendKeySync(KeyEvent event) {  
  12. try {  
  13. (IWindowManager.Stub.asInterface(ServiceManager.getService("window"))).injectKeyEvent(event, true);  
  14. catch (RemoteException e) {}  
  15. }  


2.常见按键消息
Key  | Constant Value
Back 4
Power 26
Menu 82
Home 3
Search 84

方向键:
上 19
下 20
左 21
右 22
确认(类似单击):23

音量键:
音量减 25
音量加 24


二、为Android系统添加模拟按键对外接口
步骤一:在Android源码中传建新扩展模块目录
    在源码的frameworks/base/cmds下传建一个文件夹,本例文件夹命名【analog_control】,在此目录下可存放用java或C编写的可运行程序。

步骤二:编写模拟按键相关代码
    在步骤一所创建的目录下新建一个AnalogControl.java文件,编写程序代码,在此你可以使用IWindowManager类,本例需要模拟按键key,长按键keypress,点触笔touch,点触笔长按touchpress,以及移动move等。(本例代码使用引用1的代码)
[java]  view plain copy
  1. import android.view.MotionEvent;  
  2. import android.view.KeyEvent;  
  3. import android.view.IWindowManager;  
  4. import android.os.ServiceManager;  
  5. import android.os.SystemClock;  
  6. import android.os.RemoteException;  
  7. import android.util.Log;  
  8. public class AnalogControl {  
  9.   
  10.     public static void main(String args[])throws
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值