3
    adb shell sendevent /dev/input/event0 3 0 45
    adb shell sendevent /dev/input/event0 3 1 784
    adb shell sendevent /dev/input/event0 1 330 1
    adb shell sendevent /dev/input/event0 0 0 0
    adb shell sendevent /dev/input/event0 1 330 0
    adb shell sendevent /dev/input/event0 0 0 0

有没有办法通过android代码调用sendevent?当我从 shell 执行上述命令时,我能够在模拟器中生成点击事件。是否可以从android代码产生相同的效果?任何人请帮助我。

4

3 回答 3

1

点击(或触摸)事件的“sendevent”命令需要“root”或“su”权限。

我试图在这个问题中解决同样的问题,但我没有找到以这种方式或仅使用 SDK 工具的任何其他方式模拟触摸的任何解决方案。

但是,还有另一种模拟触摸的方法,如本文所述

接下来为我自己工作(应用程序签名并作为系统应用程序运行):

Thread thread = new Thread(){
@Override
public void run(){
    try {
        this.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Instrumentation m_Instrumentation = new Instrumentation();
        m_Instrumentation.sendPointerSync(MotionEvent.obtain(
                SystemClock.uptimeMillis(),
                SystemClock.uptimeMillis(),
            MotionEvent.ACTION_DOWN,posx, posy, 0));
    m_Instrumentation.sendPointerSync(MotionEvent.obtain(
            SystemClock.uptimeMillis(),
            SystemClock.uptimeMillis(),
            MotionEvent.ACTION_UP,posx, posy, 0));
     }
};
thread.start();
于 2013-02-26T00:57:42.090 回答
1

我不知道把它放在哪里,但如果有人在使用这里首先发布的方法让“sendevent”代码在 ICS 上工作时遇到问题,我已经想出了如何去做。不过,它确实需要 SU 访问权限。至少对我来说问题是这样的。

我将在下面发布代码,然后解释每个部分。

当您执行“getevent”以获取触摸板上的触摸事件的十六进制代码(我的是 /dev/event1)时,它会吐出一堆数据,从十六进制转换为十进制后将如下所示。

第一组是 7 行,接下来是 9 行,用于单次触摸事件。为什么?没有线索。语法是 this (device) (1, 3, or 0, not understand) (value, 这可能意味着很多东西。在我的例子中,58 是我设备的标识符,53 和 54 表示坐标是值) (value , ETC)

sendevent /dev/input/event1    3    58   255 #means '3, variable 58 is 255'
sendevent /dev/input/event1    3    53   534 #'3, variable 53 (x axis) is 534
sendevent /dev/input/event1    3    54   321 #'3, variable 54 (y axis) is 534
sendevent /dev/input/event1    3    48     8 #'3, variable 48 (pressure maybe) is 8
sendevent /dev/input/event1    0     2     0 #i think the 0,2,0 means 'finger down or up
sendevent /dev/input/event1    1   330     1 #this, followed by 0,0,0 means 'end of event'
sendevent /dev/input/event1    0     0     0

与所有这些相同,接受这是事件的另一端,如果第一部分的意思是#'he put his finger down' 这意味着'他捡起它。

sendevent /dev/input/event1    3    58     0
sendevent /dev/input/event1    3    53   534
sendevent /dev/input/event1    3    54   321
sendevent /dev/input/event1    3    48     8
sendevent /dev/input/event1    0     2     0 
sendevent /dev/input/event1    0     0     0
sendevent /dev/input/event1    1   330     0
sendevent /dev/input/event1    0     2     0
sendevent /dev/input/event1    0     0     0

乍一看,这似乎是两个不同的触摸事件,这是我出错的地方。这实际上是一种“呼叫和应答类型的情况”。此代码将产生一个单一的触摸事件。顺便说一句,我使用 shell 脚本和 smanager 来获取它,而不必自己破译十六进制数据,它被称为“sendeventgetevent.sh”谷歌它。

我很高,这很难解释,但如果你是 root,下面的代码将在 4.0.4 ICS 中提供的坐标上产生一个单一的触摸事件。当然,您必须对其进行调整以使其正确。下载 sendeventgetevent.sh,使用像 smanager 这样的脚本管理器来运行它并继续运行。

$su
sendevent /dev/input/event1    3    58   255;
sendevent /dev/input/event1    3    53   534;
sendevent /dev/input/event1    3    54   321;
sendevent /dev/input/event1    3    48     8;
sendevent /dev/input/event1    0     2     0;
sendevent /dev/input/event1    1   330     1;
sendevent /dev/input/event1    0     0     0;
sendevent /dev/input/event1    3    58     0;
sendevent /dev/input/event1    3    53   534;
sendevent /dev/input/event1    3    54   321;
sendevent /dev/input/event1    3    48     8;
sendevent /dev/input/event1    0     2     0;
sendevent /dev/input/event1    0     0     0;
sendevent /dev/input/event1    1   330     0;
sendevent /dev/input/event1    0     2     0;
sendevent /dev/input/event1    0     0     0;
于 2014-11-14T21:58:15.007 回答
0

您应该能够通过 Runtime.exec() 方法发出相同的 shell 命令:http: //developer.android.com/reference/java/lang/Runtime.html

于 2013-02-06T18:58:57.480 回答