【问题标题】:Simulating arrow key presses in android在android中模拟箭头键按下
【发布时间】:2013-03-07 15:31:48
【问题描述】:

我目前正在开发一个模拟 d-pad(上、下、左和右)的应用程序。问题是我不知道如何将这些按键发送到其他应用程序。

目前,我正在使用 Instrumentation,它在我的应用程序的活动中运行良好。 下面是方向键左键的sn-p代码:

new Thread(new Runnable() {         
                    @Override
                    public void run() {                 
                        new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_LEFT);
                    }   
                }).start();

这个实现的问题是,由于 android 的安全功能,我无法将按键发送到其他应用程序。 在搜索了注入按键的不同方法后,我遇到了这个article。但是,在尝试了示例代码之后,它似乎不起作用。我四处寻找,发现android似乎没有键盘输入设备。当我扫描不同的输入设备时,我会得到诸如方向传感器之类的东西。这是我手机上所有输入设备的图片(T-959 Galaxy S)。

如您所见,这些设备都不是键盘。我有一种感觉,这是因为我的手机没有物理键盘。 (cypress是电容键,aries是音量键,mxt224是触屏控制器)

经过一番研究,我发现android中的accessibility api对注入事件有限制,但这些只是非常基本的东西,比如切换视图焦点等(AccessibilityNodeInfo)。不过,我觉得我可以扩展它以支持箭头键按下。

所以目前,我很困惑去哪里。有没有人做过这样的事情?由于 Android 中的安全功能,似乎简单地注入箭头键(仅此而已)非常令人沮丧。欢迎所有建议。

编辑:我可能不是很清楚,但我可以只为有根手机构建它。唯一的要求是这个应用程序必须在手机上独立运行,而不是通过 otg 或通过 adb 连接到任何外部键盘。

【问题讨论】:

    标签: android key inject arrow-keys


    【解决方案1】:

    几天前我想模拟 DPAD 按键事件,但我确实找到了一个有其自身局限性的解决方案。

    可以使用 adb commandinput keyevent <keycode> 模拟箭头键按下。 所以如果你想模拟一个 DPAD LEFT 按键然后使用 adb 命令adb input keyevent 21

    为了重用这段代码并将其向前扩展,我创建了一个独立的 Swing 应用程序,在其中我选择了我需要向其发送按键事件的设备,并且我可以使用计算机的现有键盘来输入按键。 [我将键盘键码映射到 android 键码]。

    我正在通过包含远程和游戏手柄按钮来进一步扩展应用程序,一旦完成,我会将项目上传到 git。

    希望这会有所帮助。

    【讨论】:

    • 我可以在不连接电脑的情况下在手机上运行它吗?我只是将它作为具有 su root 访问权限的 shell 命令运行吗?这看起来很简单,但我觉得这仍然取决于输入设备(我可能错了)。我很乐意看到这个,因为这听起来像是解决我的问题的一个非常简单的方法。
    • 我建议的解决方案需要连接到电脑,因为我使用的是电脑键盘。但你可以通过从 android 设备调度 shell 命令来做同样的事情
    • keyevent 21 对于 DPAD LEFT 事件是否在所有设备上通用?我会假设是的,因为它是一个 adb 命令,但我只是想确定一下。
    • 我尝试使用 root 权限在我的服务中运行 input keyevent 21,但它仍然不起作用。密钥注入仍然需要通过安卓系统,所以它仍然被认为是安全漏洞。在我的应用程序中工作得很好(响应有点延迟),但是如果我尝试在我的应用程序之外执行命令,它会发送一个与我从 Instrumentation 方法得到的错误相同的错误。
    • 您是否使用系统(平台)密钥签署了您的应用程序?这可能会解决您以前用于注入指针事件的代码的问题
    【解决方案2】:

    如果您打算创建一个可在非 root 手机上运行的应用程序,那么最好的办法是使用 http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html 实现一个新的 InputMethod

    【讨论】:

    • 这会和用户使用的键盘冲突吗?我认为您一次只能有一种活动输入法,如 inputmethodmanager 所述。
    猜你喜欢
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多