Android系统全局触摸事件监听
Android系统全局触摸事件监听
Android触摸全局监听指的是调用监听后在任何界面都能获取到触摸事件。要实现这个功能必须要修改源码添加新的接口,因为系统默认是不暴露这个方法的。
监听系统全局触摸事件的类和相关代码:
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java
@Override
public void registerPointerEventListener(PointerEventListener listener, int displayId) {
Slog.i(TAG, "registerPointerEventListener PointerEventListener = " + listener);
synchronized (mGlobalLock) {
final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
if (displayContent != null) {
displayContent.registerPointerEventListener(listener);
}
}
}
@Override
public void unregisterPointerEventListener(PointerEventListener listener, int displayId) {
synchronized (mGlobalLock) {
final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
if (displayContent != null) {
displayContent.unregisterPointerEventListener(listener);
}
}
}
第一个参数:是中PointerEventListener接口,
里面有MotionEvent对象含有点击事件,比如DOWN、UP、MOVING等其他信息。
package android.view;
public interface WindowManagerPolicyConstants {
interface PointerEventListener {
void onPointerEvent(MotionEvent motionEvent);
}
}
第二个参数,屏幕id,正常用0 ,表示主屏幕id。有些设备有投屏或者第二屏才需要关注这个。
下面介绍如何注册这个服务
1、绑定这个系统服务,这个方法行不通
因为这个服务的aidl接口IWindowManager,并没有暴露这个方法
registerPointerEventListener方法定义在另一个内部接口 WindowManagerFuncs 中
public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
public interface WindowManagerFuncs {
/** Register a system listener for touch events */
void registerPointerEventListener(PointerEventListener listener, int displayId);
/** Unregister a system listener for touch events */
void unregisterPointerEventListener(PointerEventListener listener, int displayId);
}
}
2、获取WindowManagerFuncs对象,该对象获取的方式在源码中有多种
参考:
frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
public PhoneWindowManager extends AbsPhoneWindowManager implements WindowManagerPolicy, IHwPhoneWindowManagerInner{
public WindowManagerFuncs getWindowManagerFuncs(){
return mWindowManagerFuncs;
}
}
WindowManagerFuncs在源码中是可以直接new的,使用如下:
PhoneWindowManager phoneWindowManager = new PhoneWindowManager();
WindowManagerFuncs windowManagerFuncs = phoneWindowManager.getWindowManagerFuncs();
windowManagerFuncsEx.registerPointerEventListener(listener, Display.DEFAULT_DISPLAY);