【发布时间】:2020-08-19 14:22:58
【问题描述】:
我有一个在后台运行的 Android 服务,它接收来自 HAL 层的密钥输入。该服务应执行 DPAD 向上/向下/向右/向左/中心移动。
应用程序可以捕捉到 DPAD 方向,但不会自动使用。
同时,如果我尝试使用 adb shell input keyevent 注入相同的关键事件,它可以在应用程序内部工作,在它们被消耗和执行的意义上工作,如果我注入 DPAD 右,焦点转到右侧应用程序屏幕。
我的服务注入 keyevent 和 ADB 注入 keyevents 之间的实际区别是什么?我是否缺少任何权限?
这是我的服务代码:
private boolean sendKeyEvent(int keycode) {
boolean bResult = false;
InputManager im = InputManager.getInstance();
if (im == null) {
Log.e(TAG, "Input Manager not available.");
return false;
}
KeyEvent evDown = new KeyEvent(1, new Date().getTime(), android.view.KeyEvent.ACTION_DOWN, keycode, 1);
KeyEvent evUp = new KeyEvent(1, new Date().getTime(), android.view.KeyEvent.ACTION_UP, keycode, 1);
Log.d(TAG, "sending: keycode: " + keycode);
boolean retval = im.injectInputEvent(evDown, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
Log.d(TAG, "injectedInputEvent down returned with: " + retval);
boolean retval2 = im.injectInputEvent(evUp, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
Log.d(TAG, "injectedInputEvent up returned with: " + retval2);
return bResult = retval && retval2;
}
服务实际上是用整个系统镜像构建的,所以可以添加任何权限。
谢谢。
【问题讨论】: