简介
Android系统是在Linux 2.6版本上开发的,所以起使用设备驱动 /dev/input/event X (x为0到7)分别来映射不同事件。
内容
这里就简单介绍两种系统自带类来实现系统事件注入。
方式一:
需要使用的类如下:
android.os.ServiceManager
android.view.IWindowManager
很不幸,笔者在引用他的使用,发现已经被隐藏了,经过查阅资料,有两种方法可引用。
1、在项目中创建对应路径的包和类,然后引用,如下:
package android.os;
import android.os.IBinder;
public class ServiceManager {
public static IBinder getService(String serviceName) {
return null;
}
}
package android.view;
import android.os.IBinder;
import android.view.KeyEvent;
import android.view.MotionEvent;
public interface IWindowManager {
public static class Stub {
public static IWindowManager asInterface(IBinder binder) {
return null;
}
}
// 注入自己的窗口事件
public boolean injectKeyEvent(KeyEvent ev, boolean sync);
public boolean injectPointerEvent(MotionEvent ev, boolean sync);
public boolean injectTrackballEvent(MotionEvent ev, boolean sync);
// public boolean injectInputEventNoWait(InputEvent ev);
}
2、载入类,添加代码替换原来的实现方法。
try{
Object object = new Object();
Method getService = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
Object obj = getService.invoke(object, new Object[]{new String("window")});
//System.out.println(obj.toString());
windowMger = IWindowManager.Stub.asInterface((IBinder)obj);
}catch(Exception ex){
}
方式二:
需要使用的类如下:
android.app.Instrumentation
Instrumentation是Android 测试环境的一个核心框架,在这个框架下,你的测试应用程序可以精确控制应用程序。使用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态。Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。
测试如下:
Instrumentation m_Instrumentation = new Instrumentation();
m_Instrumentation
.sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
注意:以上方法只能用于本程序,用于其它程序会包INJECT_EVENTS权限不够错误,但笔者添加了INJECT_EVENTS权限,没有起到作用。
<uses-permission android:name="android.permission.INJECT_EVENTS" />
//允许一个程序截获用户事件如按键、触摸、轨迹球等等到一个时间流,android 开发网提醒算是hook技术吧
那么如何突破INJECT_EVENTS权限问题?方法有两:
一、将你的程序或服务改成系统级别的,在manifest加如下代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.banketree.testinjectorandroid"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="android.uid.system" >
然后源文件添加到添加Android.mk文件,重新编译源码。
二、通过jni的方法将kernel 的发送keyevent的方法用NDK封装成方法,做成库给java调用,封装事件写入jni,然后Java调用,从而不必通过Android WindowsManagerService的验证,具体如何实现,后期贴出。
结束
简单的介绍了向系统注入事件的两种方法,该两种方法都可以达到功能要求,但仅能在原生程序中执行。
项目下载
分享到:
相关推荐
Android代码模拟按键事件,demo中以按数字键1为例子,响应power按键事件,系统进待机。按数字键1可以替换成接收消息,广播,接口回调,等等
android系统模拟点击事件发送QQ消息.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
博文源码《Android基于Socket无线遥控(2)--无线控制篇》 http://blog.csdn.net/zzp16/article/details/7939852 为Android系统添加模拟按键对外接口
原理是在jni中通过Linux内核的ioctl函数和c语言函数(memset、write)来实现对设备的I/O通道进行管理的。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。
有个问题是,我的实现方式和在activity里面模拟点击事件完全不同,我的目的不是在一个activity里模拟系统点击事件,只是用这个例子来测试下看看能不能把数据写到驱动里,系统自动响应写进去的代码,模拟出我手动点击...
在Android应用程序中,有一类特殊的消息,是专门负责与用户进行交互的,它们就是触摸屏和键盘等输入事件。触摸屏和键盘事件是统一由系统输入管理器InputManager进行分发的。也就是说,InputManager负责从硬件接收...
安卓考试系统java编写有单选题,多选题,判断题做题改卷处理代码,可选择题库。输入做题范围。题库在assets里面,运用读取txt文件知识、事件处理、基本控件等知识。
android游戏开发粒子模拟
android注入代码到驱动模拟系统点击事件demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
模拟android系统中控件之间焦点移动效果
模拟列车查询系统,模拟车站查询,车次查询,添加功能
模拟Android系统Zygote启动流程
操作系统作业,模拟操作系统的内存分配,分区回收。
操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...
注意!我有用到appcompat_v7依赖包!所以没有的同学可以到我的上传资源列表中下载 ps:我只实现了循环首次适应算法和最佳适应算法
这个demo的最终效果就是,打开这个app以后,点击启动服务,然后程序会自动请求root权限,如果你的手机root过,或者有root权限管理工具的话,就选择授权,然后,手机会自动回到主页,然后打开QQ,然后搜索联系人,...
安卓考试系统java编写有单选题,多选题,判断题做题改卷处理代码,可选择题库。输入做题范围。题库在assets里面,运用读取txt文件知识、事件处理、基本控件等知识。
Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对...
Android模拟教务系统登录的设计与实现.pdf
Android 6.0系统以下,可以通过Setting.Secure.ALLOW_MOCK_LOCATION获取是否【允许模拟位置】,当【允许模拟位置】开启时,可addTestProvider; Android 6.0系统及以上,弃用Setting.Secure.ALLOW_MOCK_LOCATION变量...