【问题标题】:Invoking sendevent in android via code通过代码在android中调用sendevent
【发布时间】:2012-10-18 10:46:11
【问题描述】:
    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代码产生相同的效果?有谁请帮帮我。

【问题讨论】:

    标签: android event-handling touch


    【解决方案1】:

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

    【讨论】:

    • 不,您不应该这样做,因为应用程序缺乏执行此操作的权限。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      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' 这意味着'he pick up it。

      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;
      

      【讨论】:

        猜你喜欢
        • 2011-10-24
        • 1970-01-01
        • 2012-02-16
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 1970-01-01
        相关资源
        最近更新 更多