如何从C客户端连接到Android服务并注入Key事件?

时间:2013-04-22 20:29:43

标签: android android-ndk native

我正在寻找一种从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而不是我追求的本机方法,取得了很多进展。

0 个答案:

没有答案