简介
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代码中模拟按键事件,以按数字键1为例,并扩展到如何响应电源键事件使系统进入待机状态。 首先,Android中的按键事件主要通过`KeyEvent`类来处理。`KeyEvent`对象代表用户在硬件键盘上...
总之,这个压缩包中的项目为我们提供了一个学习和实践Android系统模拟点击事件的机会,特别是结合QQ应用发送消息的场景。通过深入理解和应用这些技术,我们可以为自动化测试、辅助工具开发或者特定需求的解决方案...
在Android平台上,有...总的来说,Android模拟按键是一个技术性较强的话题,涉及到事件处理、权限控制以及可能的无障碍服务实现。开发者需要理解这些概念,并在合法和安全的前提下,合理地利用它们来增强应用的功能。
在Android Shell中模拟事件是调试和测试应用程序的一种常见方法,特别是对于那些需要手动触发特定用户输入行为的场景。本文将详细介绍如何使用Android Shell来模拟各种输入事件,包括长按、单击和滑动。 1. **基本...
这个压缩包文件"安卓按键模拟点击相关-android注入代码到驱动模拟系统点击事件demo.rar"可能包含了一个示例项目,展示了如何通过注入代码来模拟系统点击事件。下面将详细讲解这个知识点。 1. **Android事件处理机制...
本文将深入探讨一款由Java编写的Android模拟考试系统的源代码,主要关注其核心功能,如单选题、多选题和判断题的处理,以及题库的选择和管理。我们将分析如何利用Android的基本控件、事件处理机制以及读取文本文件的...
在Android系统中,"本地注入事件"是一种技术,允许应用程序模拟用户输入,如触摸屏点击、按键等。这种技术在进行自动化测试、调试或者特殊应用需求时非常有用。Android是基于Linux内核构建的,因此它继承了Linux的...
在Android开发中,有时我们需要模拟按键事件,例如创建一个手机遥控器应用,就需要在不同的进程中发送按键事件。本文将详细讲解如何实现Android跨进程模拟按键(KeyEvent)。 首先,我们来看一个基本的发送按键事件...
《基于Android模拟考试系统的开发详解》 在移动设备日益普及的今天,教育领域的数字化进程也愈发加速,基于Android平台的模拟考试系统成为了教学辅助的重要工具。本系统采用Java编程语言,利用Apache开源技术,实现...
博文源码《Android基于Socket无线遥控(2)--无线控制篇》 http://blog.csdn.net/zzp16/article/details/7939852 为Android系统添加模拟按键对外接口
原理是在jni中通过Linux内核的ioctl函数和c语言函数(memset、write)来实现对设备的I/O通道进行管理的。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。
本文将详细解析如何在Android模拟系统中发送返回键值(KEYCODE_BACK),并分析给出的代码示例。 首先,`KeyEvent.KEYCODE_BACK`是Android系统中的一个常量,表示用户按下返回键。这个键值通常用于导航至上一界面或...
Java作为一种广泛使用的编程语言,可以与Android系统紧密结合,通过特定的API和工具来实现这一目标。本篇文章将深入探讨如何使用Java自动化方法模拟Android的人工点击和触屏事件,同时涉及`platform-tools`工具包中...
在Android平台上,有时候开发者可能需要实现一种特殊的功能,即模拟鼠标指针的移动。这个"android_模拟鼠标指针demo"就是一个很好的实例,它展示了如何在Android设备上创建并控制一个虚拟的鼠标指针,使得用户能够在...
当用户触摸屏幕时,系统会生成一系列的`MotionEvent`对象,每个对象包含触摸事件的类型(ACTION_DOWN, ACTION_UP, ACTION_MOVE等)以及坐标信息。在`onTouchEvent()`中,你可以根据`event.getX()`和`event.getY()`...
有个问题是,我的实现方式和在activity里面模拟点击事件完全不同,我的目的不是在一个activity里模拟系统点击事件,只是用这个例子来测试下看看能不能把数据写到驱动里,系统自动响应写进去的代码,模拟出我手动点击...
Android模拟内存分配与回收涉及了操作系统层面的内存管理和Java层的垃圾回收机制。本教程将深入探讨这两种算法——循环首次适应算法(First Fit)和最佳适应算法(Best Fit),以及它们在Android内存管理中的应用。 ...
标题"android模拟作业调度"可能是指通过编程方式模拟这些作业调度条件,以便在测试环境中验证作业调度器的正确性和效率。这通常涉及到创建自定义的JobService,设置不同的调度参数,并观察其在不同环境下的行为。 ...
在Android开发中,模拟位置信息是一项重要的功能,特别是在测试或者开发与地理位置相关的应用时。`Location`类是Android系统提供的一种用于表示地理位置信息的核心类,它包含了经度、纬度、速度、海拔、时间和精度等...
综上所述,"Android模拟点击"涵盖了Android权限管理、服务、定时任务、坐标计算、多线程、安全隐私等多个技术领域,对于开发者来说,理解和掌握这些知识点是实现高效且安全的模拟点击功能的关键。