我正在寻找一种将键/触摸事件从 C 应用程序注入到 android 输入队列的方法。我检查了可以从命令行执行此操作的“输入”android 应用程序的源代码。它是一个绑定到Window Service 并调用injectKeyEvent 的Java 应用程序。但我喜欢从本机代码中做同样的事情。
我不希望这个应用程序可以在任何安卓手机或平板电脑上运行。这适用于我们制造的 android 设备,我们可以在其中访问 android 平台和交叉编译器工具链。
“输入”命令以如下方法实现此功能。我正在寻找一种从本机应用程序执行此操作的方法。
私人无效的sendKeyEvent(字符串事件)
{
int eventCode = Integer.parseInt(event);
现在很长 = SystemClock.uptimeMillis();
Log.i("SendKeyEvent", event);
尝试 {
KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, eventCode, 0);
KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, eventCode, 0);
(IWindowManager.Stub
.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE,Display.DEFAULT_DISPLAY)))
.injectKeyEvent(down, true);
(IWindowManager.Stub
.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE,Display.DEFAULT_DISPLAY)))
.injectKeyEvent(up, true);
}
捕获(远程异常 e)
{
Log.i("输入", "DeadOjbectException");
}
}
编辑:我做了更多的研究 grepping android 平台代码。我看到一个示例,其中 AudioFlinger 正在从 C++ 代码访问 MediaPlayer 服务。
静态无效 addBatteryData(uint32_t 参数){
sp 粘合剂 =
defaultServiceManager()->getService(String16("media.player"));
sp service = interface_cast(binder);
if (service.get() == NULL) {
LOGW("无法连接到 MediaPlayerService 进行电池跟踪");
返回;
}
服务->addBatteryData(参数);
}
上面的代码包含了 IMediaPlayerService.h。我正在寻找 IWindowManager.h 来访问 WindowManager 服务,但我在 android 源代码树中没有看到它。
2013 年 4 月 30 日编辑:我看到 frameworks/base/cmds/service/*/Service.cpp 允许您从 C++ 调用远程绑定程序调用。目前尚不清楚测试代码是如何为活页夹调用等提供 id 的。
我放弃了这种方法。我用平台签名的 Java 服务包装了我的 C lib。我使用 Java api 绑定到 IWindowManager 而不是我追求的本机方法取得了很大进展。