touch 이벤트가 발생하면 강제로 화면에 특정 부분을 클릭하는 어플을 만들고 있습니다.
화면의 특정 부분을 클릭하는 부분의 소스는
Instrumentation inst = new Instrumentation();
long downTime = SystemClock.uptimeMillis();
long eventTime = SystemClock.uptimeMillis();
MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, touchPosX,touchPosY, 0);
MotionEvent event2 = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, touchPosX, touchPosY, 0);
inst.sendPointerSync(event);
inst.sendPointerSync(event2);
다음과 같습니다.
문제는 이 소스를 Service 부분에 실행하는데 이러한 에러가 납니다.
08-02 22:20:58.565: E/AndroidRuntime(9960): FATAL EXCEPTION: Thread-13
08-02 22:20:58.565: E/AndroidRuntime(9960): java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission
08-02 22:20:58.565: E/AndroidRuntime(9960): at android.os.Parcel.readException(Parcel.java:1322)
08-02 22:20:58.565: E/AndroidRuntime(9960): at android.os.Parcel.readException(Parcel.java:1276)
08-02 22:20:58.565: E/AndroidRuntime(9960): at android.view.IWindowManager$Stub$Proxy.injectPointerEvent(IWindowManager.java:998)
08-02 22:20:58.565: E/AndroidRuntime(9960): at android.app.Instrumentation.sendPointerSync(Instrumentation.java:902)
08-02 22:20:58.565: E/AndroidRuntime(9960): at com.example.widgetapp.TestMain.TouchEventExec(TestMain.java:139)
08-02 22:20:58.565: E/AndroidRuntime(9960): at com.example.widgetapp.TestMain$1$1.run(TestMain.java:94)
오래된 글이지만 답변이 없어서 이 정보를 찾으시는 분들을 위해 답변 남겨봅니다.
디바이스의 터치,키 이벤트를 발생시켜서 본인 어플 외에 다른 어플에도 적용 시키려면 질문자님 말씀처럼
INJECT_EVENTS 퍼미션이 필요합니다. 헌데 이것만 있어서는 안되고요.
"플랫폼키" 라는게 필요합니다.
안드로이드는 보안과 관리의 측면에서 시스템에 중요한 영향을 미치는 몇몇 API 기능들을 막아두었습니다.
이러한 기능을 사용하고자 할때 바로 "플랫폼키" 로 사인을 하여 기능을 해제하여야 하는데, 문제는..
이것은 해당 스마트폰 제조사에서 안드로이드 플랫폼을 기기에 올릴때 생성한 키로서,
해당 기기 제조사들이 각각 관리하는 고유한 키입니다.
일례로 기기 기본 어플과 통신사 어플들이 이 플랫폼키을 이용하여 만들어진것이지요.
(특별한 기능들을 보유하고 있지요. 지우고 싶어도 지우지 못하고.. 몰래 앱을 설치한다던가..)
따라서 스마트폰 제조사와 협력을 맺고 있지 않는 이상 플랫폼키를 얻기는 불가능합니다.
하지만 단순 테스트 용도로는 에뮬레이터에 임의의 플랫폼 키사인을 하여 테스트하거나,
루팅된 폰을 이용해서 개발하는 방법이 있습니다.
결론. 스마트폰 제조사 일촌을 맺어야 개발이 가능하다. 그렇지 않으면 루팅,에뮬레이터에서만 개발 가능.




INJECT_EVENTS 이라는 퍼미션이 필요하다는 오류같은데요;;