Android中三种注入事件方法比较

 更新时间:2015年02月26日 12:01:22   投稿:junjie  
这篇文章主要介绍了Android中三种注入事件方法比较,本文分别讲解了使用内部APIs、使用instrumentation对象、直接注入事件到设备/dev/input/eventX等3种方法,需要的朋友可以参考下

方法1:使用内部APIs

该方法和其他所有内部没有向外正式公布的APIs一样存在它自己的风险。原理是通过获得WindowManager的一个实例来访问injectKeyEvent/injectPointerEvent这两个事件注入方法。

复制代码 代码如下:

IBinder wmbinder = ServiceManager.getService( "window" );
IWindowManager m_WndManager = IWindowManager.Stub.asInterface( wmbinder );

ServiceManager和Windowsmanager被定义为存根Stubs类。我们根据我们的需要绑定上这些服务并访问里面的方法。 To send a key do the following: 通过以下方式发送一个事件:
复制代码 代码如下:

// key down
m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A ),true );
// key up
m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A ),true );
 
发送touch/mouse事件:
复制代码 代码如下:

//pozx goes from 0 to SCREEN WIDTH , pozy goes from 0 to SCREEN HEIGHT
m_WndManager.injectPointerEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,pozx, pozy, 0), true);
m_WndManager.injectPointerEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,pozx, pozy, 0), true);

这种方法能在你的应用中很好的工作,但,也仅仅只能在你的应用中而已

一旦你想要往其他窗口注入keys/touch事件,你将会得到一个强制关闭的消息:

方法2: 使用instrumentation对象

  相对以上的隐藏接口和方法,这个是比较干净(上面的是隐藏的,故需要用到android不干净不推荐的方法去获取)的方式,但不幸的事它依然有上面的JINECT_EVENTS这个只有系统应用(基本上就是android自己提供的,如monkey)才被允许的权限问题。

复制代码 代码如下:

Instrumentation m_Instrumentation = new Instrumentation();
m_Instrumentation.sendKeyDownUpSync( KeyEvent.KEYCODE_B );

以下是触摸事件实例:
复制代码 代码如下:

//pozx goes from 0 to SCREEN WIDTH , pozy goes from 0 to SCREEN HEIGHT
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,pozx, pozy, 0);
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,pozx, pozy, 0);

在应用内操作的话完全没有问题,但一旦跳出这个应用去触发按键事件的话就会崩溃。不是因为这个方法不工作,而是因为android开发人员做了限制。谢谢你们,android的开发者们,你牛逼!个屁。

  通过分析sendPointerSync的对应代码,可以看到其实instrumentation使用到的注入事件方式其实和方法一提到的通过WindowManager.injectPointerEvents是一样的,所以穿的都是同一条内裤,只是Robotium出来走动的时候套上条时尚喇叭裤,而以上直接调用WindowManager的方式就犹如只穿一条内裤出街的区别而已。

复制代码 代码如下:

public void sendPointerSync(MotionEvent event) {
validateNotAppThread();
try {
(IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
.injectPointerEvent(event, true);
} catch (RemoteException e) {
}
}

方法3:直接注入事件到设备/dev/input/eventX

linux以系统设备的方式向用户暴露了一套统一的事件注入接口/dev/input/eventX(其中X代表一个整数)。我们可以直接跳用而跳过以上的平台(android这个机遇linux的平台)限制问题。但是这需要工作的话,你需要rooted过的设备。

设备文件eventX默认是被设置为660这个权限的(Owner和同组成员有读写,而owner是root)。为了向这个设备注入事件,你必须让它能可写。所以请先做以下动作:

复制代码 代码如下:

adb shell
su
chmod 666 /dev/input/event3

你将需要root权限来运行chmod命令。

相关文章

  • 详解Android框架MVVM分析以及使用

    详解Android框架MVVM分析以及使用

    这篇文章主要介绍了详解Android框架MVVM分析以及使用,对MVVM感兴趣的同学,一定要看一下
    2021-04-04
  • Android使用多线程实现断点下载

    Android使用多线程实现断点下载

    这篇文章主要介绍了Android使用多线程实现断点下载,多线程下载是加快下载速度的一种方式,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Rxjava实现发送验证码倒计时功能

    Rxjava实现发送验证码倒计时功能

    这篇文章主要为大家详细介绍了Rxjava实现发送验证码倒计时功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Android开发之日历CalendarView用法示例

    Android开发之日历CalendarView用法示例

    这篇文章主要介绍了Android开发之日历CalendarView用法,简单分析了日历CalendarView组件的功能、属性设置方法、界面布局、事件监听等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Android Retrofit框架的使用

    Android Retrofit框架的使用

    这篇文章主要介绍了Android Retrofit框架的使用,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-03-03
  • Android高级xml布局之输入框EditText设计

    Android高级xml布局之输入框EditText设计

    这篇文章主要为大家详细介绍了Android高级xml布局之输入框EditText设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Kotlin Flow常用封装类StateFlow使用详解

    Kotlin Flow常用封装类StateFlow使用详解

    这篇文章主要为大家介绍了Kotlin Flow常用封装类StateFlow使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Android图片加载利器之Picasso扩展功能

    Android图片加载利器之Picasso扩展功能

    这篇文章主要为大家详细介绍了Android图片加载利器之Picasso扩展功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    这篇文章主要介绍了Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴) 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • android.graphics.Matrix类用法分析

    android.graphics.Matrix类用法分析

    这篇文章主要介绍了android.graphics.Matrix类,较为详细的分析了Matrix类矩阵与坐标运算的相关函数功能与使用注意事项,并结合实例形式分析了android.graphics.Matrix类具体使用方法,需要的朋友可以参考下
    2017-08-08

最新评论