Android 의 세 가지 주입 이벤트 방법 비교

방법 1:내부 API 사용
이 방법 은 다른 모든 내부 에서 공식 적 으로 발표 되 지 않 은 API 와 마찬가지 로 자신 만 의 위험 이 존재 한다.원 리 는 Window Manager 의 인 스 턴 스 를 통 해 injectKeyEvent/injectPointerEvent 라 는 두 사건 의 주입 방법 을 방문 하 는 것 입 니 다.

IBinder wmbinder = ServiceManager.getService( "window" );
IWindowManager m_WndManager = IWindowManager.Stub.asInterface( wmbinder );
ServiceManager 와 윈도 우즈 관리 자 는 저장 루트 Stubs 클래스 로 정 의 됩 니 다.우 리 는 우리 의 필요 에 따라 이 서 비 스 를 연결 하고 안에 접근 하 는 방법 입 니 다.To send a key do the following:다음 과 같은 방식 으로 이 벤트 를 보 냅 니 다.

// key down
m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_A ),true );
// key up
m_WndManager.injectKeyEvent( new KeyEvent( KeyEvent.ACTION_UP, KeyEvent.KEYCODE_A ),true );
 
touch/mouse 이벤트 보 내기:

//pozx goes from 0 to SCREEN WIDTH , pozy goes from 0 to SCREEN HEIGHT
m_WndManager.injectPointerEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,pozx, pozy, 0), true);
m_WndManager.injectPointerEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,pozx, pozy, 0), true);
이런 방법 은 당신 의 응용 에서 매우 좋 은 일 을 할 수 있 지만,단지 당신 의 응용 에서 만 가능 합 니 다.

다른 창 에 키스/touch 이 벤트 를 주입 하려 면 강제로 닫 는 메 시 지 를 받 을 수 있 습 니 다.

방법 2:instrumentation 대상 사용
이상 의 숨겨 진 인터페이스 와 방법 에 비해 이것 은 비교적 깨끗 하 다(위 에 숨겨 진 것 이 므 로 안 드 로 이 드 가 깨끗 하지 않 고 추천 하지 않 는 방법 으로 얻어 야 한다).그러나 불행 한 일 은 위 에 있 는 JINECT 가 있다.EVENTS 는 시스템 애플 리 케 이 션(기본적으로 안 드 로 이 드 가 제공 하 는,예 를 들 어 몽 키)만 허용 되 는 권한 문제 입 니 다.

Instrumentation m_Instrumentation = new Instrumentation();
m_Instrumentation.sendKeyDownUpSync( KeyEvent.KEYCODE_B );
다음은 터치 이벤트 인 스 턴 스 입 니 다.

//pozx goes from 0 to SCREEN WIDTH , pozy goes from 0 to SCREEN HEIGHT
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN,pozx, pozy, 0);
m_Instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),MotionEvent.ACTION_UP,pozx, pozy, 0);

응용 프로그램 에서 조작 하면 전혀 문제 가 없 지만 이 프로그램 에서 벗 어 나 버튼 이 벤트 를 터치 하면 무 너 집 니 다.이 방법 이 작 동 하지 않 기 때 문 이 아니 라 안 드 로 이 드 개발 자가 제한 을 했 기 때문이다.감사합니다.개 뿔.
sendpointersync 의 대응 코드 분석 을 통 해 알 수 있 듯 이 instrumentation 이 사용 하 는 주입 이벤트 방식 은 사실 과 방법 에 언급 된 Window Manager.injectPointerEvents 를 통 해 같 기 때문에 같은 팬 티 를 입 었 습 니 다.다만 Robotium 이 나 올 때 유행 하 는 나팔 바 지 를 입 었 습 니 다.위 에서 Window Manager 를 직접 호출 하 는 방식 은 팬티 한 벌 만 입고 거리 로 나 가 는 것 과 같다.

public void sendPointerSync(MotionEvent event) {
validateNotAppThread();
try {
(IWindowManager.Stub.asInterface(ServiceManager.getService("window")))
.injectPointerEvent(event, true);
} catch (RemoteException e) {
}
}
방법 3:장치/dev/input/eventx 에 이 벤트 를 직접 주입 합 니 다.
Liux 는 시스템 장치 의 방식 으로 사용자 에 게 통 일 된 이벤트 주입 인터페이스/dev/input/eventX(그 중에서 X 는 하나의 정 수 를 대표 합 니 다)를 노출 시 켰 습 니 다.우 리 는 상기 플랫폼(android 라 는 기회 Liux 의 플랫폼)제한 문 제 를 직접 뛰 어 넘 을 수 있 습 니 다.하지만 일이 필요 하 다 면 rooted 장치 가 필요 합 니 다.
장치 파일 eventX 는 기본적으로 660 권한 으로 설정 되 어 있 습 니 다(Owner 와 같은 그룹 구성원 은 읽 기와 쓰기 가 있 고 owner 는 root 입 니 다).이 장치 에 이 벤트 를 주입 하기 위해 서 는 쓸 수 있 도록 해 야 합 니 다.그 러 니 다음 동작 을 하 세 요.

adb shell
su
chmod 666 /dev/input/event3
chmod 명령 을 실행 하려 면 루트 권한 이 필요 합 니 다.

좋은 웹페이지 즐겨찾기