2011-03-09 21 views
13

私はMotionEventを「合成」する方法を知っている:合成MotionEventをシステム経由で送信する方法は?

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

私がで立ち往生していますが、それが「あるかのように」扱われるように、システムを通してそれを「/ポスト/火を送信/配布」する方法です実際のユーザは実際に指で画面に触れた。

これはまったく可能ですか?

もしそうなら、これはどのようにして達成できますか?

+0

あなたのレイアウトとあなたがそれを使用しているコードの一部を貼り付けることはできますか? pls ... – Markonato

答えて

4

いいえ、それは設計により防止されています。懸念事項は、このような機能を使用してセキュリティモデル全体を覆すことができるということです。マーケットプレイスに連絡するためのタッチを「注入する」ことによって、インストールを手配し、セキュリティ警告を受け入れることができます。

これは、長さhere以降で議論されています。

これがあなたの質問に答えるなら、親切に左のチェックマークをクリックしてください - ありがとう!何をしようとする

+0

あなたの答えが正しいと分かったら、私はそれが好きではありません。 :)あなたが言っているのは理にかなっていますが、InstrumentationTestCaseクラスに精通していれば、私が達成しようとしていることはそうだと思います。あなたはこれについて完全に確かですか? **少なくとも自分のapp/activity/viewのみにMotionEventを「偽造する」ことは可能ですか? –

+1

@REGあなたが正しい人であることが判明したら、私は気に入っています:) InstrumentationTestCaseやMonkeyなどが利用可能であることは、実際には「アドオン」イベントインジェクタの能力を実証しています。私が読んだこと(残念なことに、これが数ヶ月前のことだったので、refを思い出さないでください)は、イベントがハードウェアで保護されたゲートを介してシステムに入ってくることです。キーがある場合は、イベントを注入できます。これらのツールは、非常に制限された条件で使用するために特殊キーを使用しているようです。あなたが見つけられるかもしれない何かを聞くのを楽しみにしています... – DJC

+0

私はすでにこれまでの唯一の手がかりとして+1を与えました。あなたのコメントでこの問題をさらに明確にするためにもう一度+1します。私のコメントで述べたように、私は**システム**にイベントを注入することに本当に関心がありません。**私の**ビューの1つでテキスト選択タスクを達成することにのみ関心があります。 http://stackoverflow.com/questions/5250290/why-doesnt-this-motionevent-simulation-workこれはまったく可能ですか? –

17

は完全に可能で簡単です:

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); 
} 
+0

ありがとうございます!これはまさに私がWebViewで開くために適切なソフトキーボードを得るために必要なものです。入力ボックスへのクリックをシミュレートする必要があります – Pre101

+0

@pryma ACION_MOVEを除くすべてのアクションはプロンプトなしでディスパッチしています。 ACTION_MOVEへのアクションは、常にMotionEvent.getX()でarrayindexoutofboundsexceptionを投げています。何が起きているのでしょうか? –

+0

'v'が' ViewGroup'のように見えます。 (つまり、それは 'dispatchTouchEvent'と' onTouchEvent'を呼び出すのと同じです) –

関連する問題