2011-03-09 15 views
13

Tôi biết làm thế nào để "tổng hợp" một MotionEvent:Làm thế nào để gửi MotionEvent tổng hợp thông qua hệ thống?

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

Những gì tôi đang bị mắc kẹt tại là làm thế nào để "gửi/bài/lửa/phân phối" nó thông qua hệ thống, do đó nó được xử lý "như thể" một người dùng thực sự chạm vào màn hình bằng ngón tay của mình.

Điều này có thể thực hiện được không?

Nếu có, làm cách nào để thực hiện việc này?

+0

Bạn có thể dán bố trí và một phần của mã nơi bạn đang sử dụng mà bạn? xin vui lòng ... – Markonato

Trả lời

4

Không, nó bị ngăn cản bởi thiết kế. Mối quan tâm là một tính năng như vậy có thể được sử dụng để phá hoại toàn bộ mô hình bảo mật - ví dụ: bằng cách "tiêm" chạm để liên lạc với thị trường, sắp xếp một cài đặt, chấp nhận các cảnh báo bảo mật .. tất cả ngày của riêng mình.

Điều này đã được thảo luận ở một số độ dài here và sau.

Nếu điều này trả lời câu hỏi của bạn, vui lòng nhấp vào dấu kiểm ở bên trái - cảm ơn!

+0

Nếu câu trả lời của bạn hóa ra là chính xác, thì tôi không thích nó. :) Những gì bạn đang nói có ý nghĩa nhưng nếu bạn đã quen thuộc với các lớp InstrumentationTestCase tôi nghĩ rằng nó làm những gì tôi đang cố gắng để thực hiện. Bạn hoàn toàn chắc chắn về điều này? Có thể ít nhất MotionEvents "giả" để ** ** ứng dụng/hoạt động/chế độ xem của riêng tôi không? –

+1

@REG Nếu bạn trở thành người thích hợp, tôi sẽ thích nó :) Tính sẵn sàng của InstrumentationTestCase, Monkey, v.v. thực sự chứng tỏ khả năng cho các bộ phun sự kiện "add-on". Những gì tôi đọc (xin lỗi, không nhớ ref vì đây là tháng trở lại) là sự kiện đi vào hệ thống thông qua một cổng bảo mật phần cứng. Nếu bạn có khóa, bạn có thể tiêm các sự kiện. Các công cụ này dường như đang sử dụng các phím đặc biệt để sử dụng trong các điều kiện hạn chế cao. Tôi mong muốn được nghe về bất kỳ điều gì khác bạn có thể tìm thấy ... – DJC

+0

Tôi đã cung cấp cho bạn một +1 cho manh mối duy nhất cho đến nay tôi đã nhận được về thách thức này. Tôi sẽ cung cấp thêm một +1 nữa để làm rõ thêm vấn đề này trong nhận xét của bạn. Như tôi đã nói trong nhận xét của mình, tôi không thực sự quan tâm đến việc tiêm một sự kiện vào ** hệ thống **, tôi chỉ quan tâm đến việc hoàn thành tác vụ chọn văn bản trong một trong ** lượt xem ** của tôi. Xem http://stackoverflow.com/questions/5250290/why-doesnt-this-motionevent-simulation-work Điều này có thể xảy ra không? –

17

Những gì bạn đang cố gắng làm là hoàn toàn có thể và đơn giản:

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

Cảm ơn bạn! Đây chính xác là những gì tôi cần để có được bàn phím mềm phù hợp để mở trong một WebView.Tôi phải mô phỏng một cú nhấp chuột vào ô nhập. – Pre101

+0

@pryma tất cả các hành động ngoại trừ ACION_MOVE được gửi đi mà không có proplem. hành động để ACTION_MOVE nó luôn luôn ném arrayindexoutofboundsexception tại MotionEvent.getX() Bạn có bất cứ ý tưởng những gì có thể xảy ra? –

+0

Hình như nếu 'v' là một' ViewGroup' nó sẽ không gửi sự kiện nào hơn là 'ViewGroup 'đối tượng chính nó (nói cách khác, nó bằng cách gọi' dispatchTouchEvent' và 'onTouchEvent'). –

Các vấn đề liên quan