【问题标题】:How to send synthesized MotionEvent through the system?如何通过系统发送合成的 MotionEvent?
【发布时间】:2011-07-11 13:11:12
【问题描述】:

我知道如何“合成”一个 MotionEvent:

  event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0);

我遇到的问题是如何通过系统“发送/发布/发射/分发”它,以便“就像”真正的用户用他或她的手指实际触摸屏幕一样处理它。

这可能吗?

如果是这样,我该如何做到这一点?

【问题讨论】:

  • 你能把你的布局和部分代码粘贴在哪里吗?请...

标签: android events


【解决方案1】:

不,这是设计阻止的。令人担忧的是,这样的特性可以用来颠覆整个安全模型——例如通过“注入”接触来联系市场、安排安装、接受安全警告……这一切都靠自己。

这已在here 及以下讨论过。

如果这回答了您的问题,请点击左侧的复选标记 - 谢谢!

【讨论】:

  • 如果你的答案是正确的,那么我不喜欢它。 :) 你说的是有道理的,但如果你熟悉 InstrumentationTestCase 类,我认为它可以完成我想要完成的工作。你对此完全确定吗?是否有可能至少“伪造”MotionEvents 来我的只拥有自己的应用程序/活动/视图?
  • @REG 如果你证明是对的,我会喜欢的:) InstrumentationTestCase、Monkey 等的可用性确实证明了“附加”事件注入器的能力。我读到的(抱歉,不记得参考,因为这是几个月前的事了)是事件通过硬件安全门进入系统。如果你有密钥,你可以注入事件。这些工具显然是在使用特殊密钥以在高度受限的条件下使用。我期待听到您可能发现的任何其他信息...
  • 我已经给了你一个 +1 的唯一线索我得到了这个挑战。我将很快再给出一个 +1,以便在您的评论中进一步澄清这个问题。正如我在评论中所说,我对将事件注入 系统 并不真正感兴趣,我只对在 my 视图之一中完成文本选择任务感兴趣.见stackoverflow.com/questions/5250290/…这可能吗?
  • 对于stackoverflow.com/questions/5250290/… 缺乏可接受的答案,我承认失败并接受您的回答。 :(
【解决方案2】:

您正在尝试做的事情是完全可能且简单的:

void simulateEventDown( View v, long x, long y )
{
    MotionEvent e = MotionEvent.obtain( SystemClock.uptimeMillis(),
                                        SystemClock.uptimeMillis(), 
                                        MotionEvent.ACTION_DOWN, 
                                        x, y, 0);
    v.dispatchTouchEvent(e);
}

【讨论】:

  • 谢谢!这正是我在 WebView 中打开正确的软键盘所需要的。我必须模拟点击输入框。
  • @pryma 除了 ACION_MOVE 之外的所有动作都在无问题地调度。当将动作设置为 ACTION_MOVE 时,它总是在 MotionEvent.getX() 处抛出 arrayindexoutofboundsexception。你知道会发生什么吗?
  • 看起来如果v 是一个ViewGroup,它不会比ViewGroup 对象本身更进一步调度事件(换句话说,它等于调用dispatchTouchEventonTouchEvent )。
  • 调用 v.onTouchEvent(e) 而不是 v.dispatchTouchEvent(e) 导致我的行为不同
猜你喜欢
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多