当前位置: 首页 > news >正文

安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

继续在网上搜索安卓按键模拟(其实那时都不知道用什么关键字好了,能想到的关键字都用遍了,但是搜索出来的结果,都是之前提到的那几个依赖源码环境和系统权限的方案)。发现有很多介绍ADB调试,向手机发送按键事件的文章。刚好之前做过在Root权限下,用Java调用安卓底层的Linux Shell,然后执行pm指令进行APK的安装卸载。这时我突发奇想,能否用Shell调用ADB指令呢?

于是就进行了尝试,使用Java执行Runtime.getRuntime().exec("su").getOutputStream(),获取了一个具有Root权限的Process的输出流对象,向其中写入字符串即可以Root权限被Shell执行,ADB模拟按键的指令为 "input keyevent keyCode",keyCode为按键的键值,例如KeyEvent.KEYCODE_VOLUME_UP表示音量加。

编译完程序安装执行,终于实现了预期的效果,当时非常高兴。至于触屏或鼠标事件,只要调用相应的ADB指令即可。但是有一点问题,就是反应速度非常慢,尤其是连续模拟多个按键的时候,甚至会死机。而按键精灵运行的就相当流畅,我又开始好奇按键精灵是怎么实现的。

后来终于还是找到了原因,模拟按键时,不应每次都调用Runtime.getRuntime().exec("su"),因为每次调用这个代码的时候,都会获取Runtime实例,并且执行"su"请求Root权限,反应就会很慢(我的理解是相当于每次都新开一个命令行窗口);而应该只是在一开始执行一次,并获取一个OutputStream实例,后来每次执行一条Shell指令,只需向其中写入相应字符串,这样就快了很多。

下面贴出可用的代码。要求设备已经Root,不需要其他任何特殊权限或签名。由于用的是ADB指令,兼容性也不会有太大问题。首次运行程序时(其实也就是执行Runtime.exec("su")的时候),会请求Root权限。

/** 
 * 用root权限执行Linux下的Shell指令 
 *  
 * @author jzj 
 * @since 2014-09-09 
 */  
public class RootShellCmd {  
  
    private OutputStream os;  
  
    /** 
     * 执行shell指令 
     *  
     * @param cmd 
     *            指令 
     */  
    public final void exec(String cmd) {  
        try {  
            if (os == null) {  
                os = Runtime.getRuntime().exec("su").getOutputStream();  
            }  
            os.write(cmd.getBytes());  
            os.flush();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 后台模拟全局按键 
     *  
     * @param keyCode 
     *            键值 
     */  
    public final void simulateKey(int keyCode) {  
        exec("input keyevent " + keyCode + "\n");  
    }  
}  

转载于:https://my.oschina.net/JiangTun/blog/673251

相关文章:

  • 第13期 DApp 榜单 :来,吃我这波安利
  • java swing启动时窗口最大化
  • 一行代码迁移TensorFlow 1.x到TensorFlow 2.0
  • Oracle 12c 数据库中scott用户不存在的解决方法
  • redis使用场景和java测试案例
  • 数据库迁移
  • 无监督学习新突破!华为美研所提出自动编码变换网络AET
  • YII AssetManager分析 最小化脚本文件
  • 迅速搭建简易静态服务器
  • 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类
  • 4.56MariaDB密码重置4.57MariaDB慢查询日志
  • 第一次作业(2)
  • 基于遗传算法的优化问题求解
  • LSMTree - SStable 初体验
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • android图片蒙层
  • Android优雅地处理按钮重复点击
  • Angular Elements 及其运作原理
  • es6(二):字符串的扩展
  • IDEA 插件开发入门教程
  • JavaScript创建对象的四种方式
  • Javascript弹出层-初探
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • python 装饰器(一)
  • 安装python包到指定虚拟环境
  • 第十八天-企业应用架构模式-基本模式
  • 强力优化Rancher k8s中国区的使用体验
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 提醒我喝水chrome插件开发指南
  • 我建了一个叫Hello World的项目
  • 小李飞刀:SQL题目刷起来!
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Oracle存储过程编写经验和优化措施
  • (转)socket Aio demo
  • (转)重识new
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net反混淆脱壳工具de4dot的使用
  • .net快速开发框架源码分享
  • .Net中的设计模式——Factory Method模式
  • .net专家(高海东的专栏)
  • .Net转Java自学之路—基础巩固篇十三(集合)