我正在寻找一种将键/触摸事件从 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 而不是我追求的本机方法取得了很大进展。