您的位置:首页 > 移动开发 > Android开发

Android用代码模拟系统物理按键长按操作(类似按键精灵)

2016-05-23 17:27 846 查看
今天同事的朋友提出一个需求,问能不能帮忙写个程序模拟他手机上长按返回键的操作。因为他手机屏幕部分区域失灵,想启用单手模式来使用手机,但是物理触控按键也失灵了。无法通过长按返回触发单手模式。由于之前没做过类似的功能,再加上手上任务不太多,于是稍微学习了一下。经过多方查找资料,发现触发系统按键方式有很多种,但是都收到安卓系统安全限制问题不能成功。最后通过adb
shell命令这种方式比较靠谱。但是前提是手机需要root。废话就到这里,下面是具体方法:

受限adb命令可以模拟手机上的各种触摸、滑动、点击等操作。但是在网上找了一大圈都没有找到模拟长按操作的方法。常见的adb 模拟操作如下:

adb 模拟触摸操作命令:

      text <string> (Default: touchscreen)  ;例如:input text helloword(模拟输入helloworld);
      keyevent [--longpress] <key code number or name> ... (Default: keyboard);
例如:1. input keyevent 4;(实现点击返回操作);2. input keyevent --longpress 4;(实现长按返回操作)---重点
      tap <x> <y> (Default: touchscreen) ; 实现点击屏幕某一点操作,x y代表屏幕上的坐标。
      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen); 实现滑动操作,前两个参数是开始坐标,接下来两个是终点坐标,最后一个是持续时间。
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)

上面是adb命令提示的常用操作,其中keyevent [--longpress] <key code number or name> ... (Default: keyboard)正是我想要的。结果我试着写这个语句:
adb shell keyevent [--longpress] 4,结果只执行了返回,没有长按。又尝试adb shell keyevent [--4000] 4,也只是返回。最后发现原来只要把longpress的[]中括号去掉就ok了。正确的写法是adb
shell keyevent --longpress 4。其中4对应的是系统的back按键。
用代码执行adb命令的方法如下所示:
public class ADBShell {
   private OutputStream os;  
 
   /**
    * <b>方法描述: </b>
    * <dd>方法作用: 执行adb命令
    * <dd>适用条件: 
    * <dd>执行流程: 
    * <dd>使用方法: 
    * <dd>注意事项: 注意,Runtime.getRuntime().exec("su").getOutputStream();网上前辈的经验说这句话貌似很耗时,所以不要每次都执行这句代码
    * 2016-5-23下午5:42:38
    * @param cmd 具体命令语句
    * @since Met 1.0
    * @see
    */
   public final void execute(String cmd) {  
       try {  
           if (os == null) {  
               os = Runtime.getRuntime().exec("su").getOutputStream();  
           }  
           os.write(cmd.getBytes());  
           os.flush();  
       } catch (Exception e) {  
           e.printStackTrace();  
       }  
   }  
 
   /**
    * <b>方法描述:模拟按键长按操作 </b>
    * <dd>方法作用: 
    * <dd>适用条件: 
    * <dd>执行流程: 
    * <dd>使用方法: 
    * <dd>注意事项: 
    * 2016-5-23下午5:44:21
    * @param keyCode 对应的按键代码
    * @since Met 1.0
    * @see
    */
   public final void simulateKey(int keyCode) {  
    execute("input keyevent --longpress " + keyCode + "\n");  
   }  

}

调用方法如下:
ADBShell adb
= new ADBShell();

adb.simulateKey(4);//系统按键的back对应代码是4,具体对应规则自行百度

通过这种方式最终实现了模拟长按back键的操作,前提必须要获取root权限哦,用类似原理可以模拟很多很多操作,具体看你的需求了。好了,第一次写博客,之前没这个习惯,写得不好之处请见谅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android