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

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

2016年05月23日 17:27:08 进而容易 阅读数:13348

今天同事的朋友提出一个需求,问能不能帮忙写个程序模拟他手机上长按返回键的操作。因为他手机屏幕部分区域失灵,想启用单手模式来使用手机,但是物理触控按键也失灵了。无法通过长按返回触发单手模式。由于之前没做过类似的功能,再加上手上任务不太多,于是稍微学习了一下。经过多方查找资料,发现触发系统按键方式有很多种,但是都收到安卓系统安全限制问题不能成功。最后通过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权限哦,用类似原理可以模拟很多很多操作,具体看你的需求了。好了,第一次写博客,之前没这个习惯,写得不好之处请见谅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值