0

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

4

0 回答 0