我正在寻找一种从C应用程序向Android输入队列注入键/触摸事件的方法。 我检查了“输入”android应用程序的源代码,可以从命令行执行此操作。它是一个绑定到Window Service并调用injectKeyEvent的Java应用程序。但我喜欢用原生代码做同样的事情。
我不希望这个应用程序在任何Android手机或平板电脑上运行。这是我们制作的Android设备,我们可以访问Android平台和交叉编译器工具链。
“input”命令在如下方法中实现此功能。我正在寻找一种从本机应用程序执行此操作的方法。
private void sendKeyEvent(String event) { int eventCode = Integer.parseInt(event); long now = SystemClock.uptimeMillis(); Log.i("SendKeyEvent", event); try { 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); } catch (RemoteException e) { Log.i("Input", "DeadOjbectException"); } }
编辑: 我已经做了一些更多研究grepping android平台代码。 我看到一个示例,其中AudioFlinger从C ++代码访问MediaPlayer服务。
static void addBatteryData(uint32_t params) { sp binder = defaultServiceManager()->getService(String16("media.player")); sp service = interface_cast(binder); if (service.get() == NULL) { LOGW("Cannot connect to the MediaPlayerService for battery tracking"); return; } service->addBatteryData(params); }
上面的代码包括IMediaPlayerService.h。我正在寻找IWindowManager.h来获取WindowManager服务,但我没有在android源代码树中看到它。
2013年4月30日编辑: 我看到frameworks / base / cmds / service / * / Service.cpp,它允许你从C ++调用远程绑定器调用。目前尚不清楚测试代码如何为绑定器调用等提供ID。
我放弃了这种方法。我使用平台签名的Java服务包装了我的C lib。我使用Java api绑定到IWindowManager而不是我追求的本机方法,取得了很多进展。