通过代码在android中调用sendevent

时间:2012-10-29 05:18:01

标签: android event-handling touch

    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执行上面的命令时,我能够在模拟器中生成click事件。是否有可能从Android代码生成相同的效果?任何人请帮助我。

3 个答案:

答案 0 :(得分:1)

用于点击(或触摸)事件的

“sendevent”命令需要“root”或“su”权限。

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

然而,还有另一种模拟触摸的方法,如this article中所述。

对于我自己的工作(app签名并作为系统应用程序运行):

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();

答案 1 :(得分:1)

我不知道在哪里放这个,但是如果有人在收到“发送”信息时遇到问题。使用首先发布在这里的方法在ICS上工作的代码我已经弄明白了如何做到这一点。它确实需要SU访问。对我来说问题至少是这个。

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

当你做' getevent'为了在你的触摸板上获取触摸事件的十六进制代码(我的是/ dev / event1),它会发出一堆数据,从十六进制转换为十进制后,这些数据将如下所示。

第一组是7行,下一个是单触摸事件的9。为什么?没有线索。语法是这个(设备)(1,3或0,不理解)(值,这可能意味着很多东西。在我的情况下58是我的设备的标识符,53和54表示坐标是值)(值等等)

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

与此相同,接受这是事件的另一端,如果第一部分意味着#'他把手指放下来'这意味着他捡起来了。

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;

答案 2 :(得分:0)

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