如何直接将触摸事件发送到/ dev / input / event?

时间:2016-03-31 19:42:44

标签: android linux linux-kernel touchscreen

我想在Android系统中发送触摸事件。我正在从后台服务发送事件。我的设备已植根,我已将我的应用程序存储在/ system / app中。

我尝试了instrumentation and system/bin/input tab,检测工具在应用程序之外无法正常工作,第二个工具不会生成错误,但什么都不做。我试过直接注入/ dev / input / event2,但是没有效果。

以下是代码:

 Thread t = new Thread(new Runnable() {
    @Override
    public void run() {




               try {
                    Process process = Runtime.getRuntime().exec("su");//supolicy --live \"allow appdomain input_device dir { ioctl read getattr search open }\" \"allow appdomain input_device chr_file { ioctl read write getattr lock append open }\"");
                    Runtime.getRuntime().exec ("su chmod 666 /dev/input/event2");
                   DataOutputStream os = new DataOutputStream(process.getOutputStream());
                    String cmd = "su /dev/input/event2  ABS_X "+  xPos + " ABS_Y "+ yPos+ "\n";

                    Runtime.getRuntime().exec(cmd);
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        t.start();

我使用此网站作为参考:https://yhcting.wordpress.com/2010/11/29/linux-writing-input-event-directly/,但我不确定我是否正确应用它。如何在/ dev / input / event2中注入事件?

另外,什么是/ dev / input / eventX?我总是看到它,但不清楚它是输入节点还是它只是事件节点的一般指示。最后,我怎么知道应该向哪个事件节点(event1,event2等)发送事件?

编辑:我通过adb shell尝试了su / dev / input / event2 ABS_X xPos ABS_Y yPos我得到了一句话:未知用户名或uid ,这是什么意思?

感谢。

2 个答案:

答案 0 :(得分:1)

我对SerialPort serialPort; DataOutputStream outputStream; void sendeSerialPort(int adresse) { System.out.println("Sende: " + adresse); if (serialPortGeoeffnet != true) return; try { outputStream.writeByte(adresse); } catch (IOException e) { System.out.println("Error when sending"); } } 了解不多。但是,要解决第一句中的主要目标,如果您在shell上有/dev/input/event2,则可以通过{{1}发送触摸事件使用如下命令:

adb

更多information for touch devices can be found here。这是一个有用的list of Android KeyCodes

答案 1 :(得分:1)

"输入"在android系统中只是一个sh脚本。

# Script to start "input" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/input.jar
exec app_process $base/bin com.android.commands.input.Input $*

跟踪Java代码"输入"实现可以在这里找到:

http://www.srcmap.org/sd_share/4/aba57bc6/AOSP_adb_shell_input_Code_Trace.html

你也可以使用" sendevent"直接注入触摸事件输入/ dev / input / event0

http://ktnr74.blogspot.com/2013/06/emulating-touchscreen-interaction-with.html