`
836811384
  • 浏览: 550270 次
文章分类
社区版块
存档分类
最新评论

Android 模拟系统事件(一)

 
阅读更多
简介

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代码模拟按键事件

    Android代码模拟按键事件,demo中以按数字键1为例子,响应power按键事件,系统进待机。按数字键1可以替换成接收消息,广播,接口回调,等等

    安卓按键模拟点击相关-android系统模拟点击事件发送QQ消息.rar

    android系统模拟点击事件发送QQ消息.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    Android系统模拟触摸按键

    博文源码《Android基于Socket无线遥控(2)--无线控制篇》 http://blog.csdn.net/zzp16/article/details/7939852 为Android系统添加模拟按键对外接口

    JNI模拟系统事件

    原理是在jni中通过Linux内核的ioctl函数和c语言函数(memset、write)来实现对设备的I/O通道进行管理的。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。

    android注入代码到驱动模拟系统点击事件demo

    有个问题是,我的实现方式和在activity里面模拟点击事件完全不同,我的目的不是在一个activity里模拟系统点击事件,只是用这个例子来测试下看看能不能把数据写到驱动里,系统自动响应写进去的代码,模拟出我手动点击...

    Android应用程序输入事件处理机制

    在Android应用程序中,有一类特殊的消息,是专门负责与用户进行交互的,它们就是触摸屏和键盘等输入事件。触摸屏和键盘事件是统一由系统输入管理器InputManager进行分发的。也就是说,InputManager负责从硬件接收...

    基于android模拟考试系统源代码.zip

    安卓考试系统java编写有单选题,多选题,判断题做题改卷处理代码,可选择题库。输入做题范围。题库在assets里面,运用读取txt文件知识、事件处理、基本控件等知识。

    android游戏开发基础模拟粒子系统

    android游戏开发粒子模拟

    安卓按键模拟点击相关-android注入代码到驱动模拟系统点击事件demo.rar

    android注入代码到驱动模拟系统点击事件demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

    android中模拟焦点移动

    模拟android系统中控件之间焦点移动效果

    android列车查询系统(模拟)

    模拟列车查询系统,模拟车站查询,车次查询,添加功能

    模拟Android系统Zygote启动流程

    模拟Android系统Zygote启动流程

    android模拟内存分配

    操作系统作业,模拟操作系统的内存分配,分区回收。

    Android模拟系统截屏.zip

    操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...

    android模拟内存分配与回收

    注意!我有用到appcompat_v7依赖包!所以没有的同学可以到我的上传资源列表中下载 ps:我只实现了循环首次适应算法和最佳适应算法

    android系统模拟点击事件发送QQ消息

    这个demo的最终效果就是,打开这个app以后,点击启动服务,然后程序会自动请求root权限,如果你的手机root过,或者有root权限管理工具的话,就选择授权,然后,手机会自动回到主页,然后打开QQ,然后搜索联系人,...

    基于android模拟考试系统源代码

    安卓考试系统java编写有单选题,多选题,判断题做题改卷处理代码,可选择题库。输入做题范围。题库在assets里面,运用读取txt文件知识、事件处理、基本控件等知识。

    android系统 Gps模拟.zip

    Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对...

    Android模拟教务系统登录的设计与实现.pdf

    Android模拟教务系统登录的设计与实现.pdf

    Android实现模拟地图定位功能.zip

    Android 6.0系统以下,可以通过Setting.Secure.ALLOW_MOCK_LOCATION获取是否【允许模拟位置】,当【允许模拟位置】开启时,可addTestProvider; Android 6.0系统及以上,弃用Setting.Secure.ALLOW_MOCK_LOCATION变量...

Global site tag (gtag.js) - Google Analytics