마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

윈도우의 keybd_event처럼 안드로이드에서도 쓸수 없을까요?

0 추천
커서가 있는 곳에서 이 함수를 사용시 그냥 키보드 입력한 것처럼 되는 함수 없을까요?
익명사용자 님이 2014년 8월 19일 질문
2014년 9월 26일 태그 변경

1개의 답변

0 추천
검색하면 다 나와요..

Instrumentation 검색 한번 해보세요.
Gioskhan (12,060 포인트) 님이 2014년 8월 19일 답변
자답입니다. instrumentation은 현재 어플리케이션에 대해서만 가능합니다. 저는 커서가 있는 곳 어디에서나 가능한 것을 말한 것이었습니다. 구글에서는 이것을 보안용으로 막아놨다고 하더군요. 실제로 써 본 결과 어플리케이션이 foreground에서는 잘 작동하지만 홈키를 통해 background로 넘겨서 종료는 시키지 않은 상태에서 instrumentation함수를 실행 시킬 시에 어플리케이션이 강제 종료가 되는 상황이 벌어지더군요.  하지만 해결책은 있다고 합니다. Hidden api를 변경하여서 시스템빌드를 하는것.. 즉, 풀소스 빌드.. 현재 풀소스 다운받는 중인데 2시간이 넘었군요.. 다 해결 한 뒤에 자답하겠습니다.
질문에 그 내용이 빠져있는데 제가 어떻게 알까요.. 질문을 다시 한번 읽어보세요. 그리고 시스템 권한을 써도 되는 경우(사이닝 가능한 경우)라면 c로 짜서 빌드 타임에 system/xbin 등에 넣고 실행해버리는 것도 방법입니다. API 변경에 대해서는 조금 조심해야할것 같아서요.
사이닝이 꼭 필요했는지 기억은 가물가물 한데요. 재미난걸 하나 알려드리면 자바에서도
Runtime.getRuntime().exec("input keyboard 23");
이렇게 하시면 키보드 오른쪽 누른 효과와 동일한 효과가 나타날겁니다.
답글 다신걸 저도 다시 읽어보니 EditText 든 뭐가 됐든 입력 가능한 포커스 상태를 캐치하려면 수정해야할 수도 있겠네요
지금 거의 80%정도 성공 했는데 방법은 제 어플에 android.uid.system을 공유하였고, INJECT_EVENT permission을 획득하였습니다. 플랫폼 키로 사이닝을 해주었는데 깔리지 않아서 풀소스 내에서 기본어플로 추가하여 빌드 해서 제 어플에 Setting과 같은 권환을 획득했고, 다른 앱에서도 KeyEvent가 날아가더군요.
괜히 어렵게 가시는건 아닌지 걱정이 되기도 하네요.. android.uid.system 권한은 특수한 권한으로 SDCARD 사용이 불가합니다. 추후 수 없이 많은 문제가 발생할 가능성이 있기에 비추합니다. 그리고 첫 댓글에서 말씀하신 백그라운드에서 Instrumentation 을 실행하셨다고 하는데 쓰레드로 돌리신게 아닌가요? 쓰레드로 돌리셨으면 onPause 발생 시 쓰레드가 헛돌게 하시면 될텐데.. onResume 에서 쓰레드 다시 정상작동 하고.. 저는 실제로 키 처리를 그렇게 쓰고 있습니다..
정확한 방법을 말씀드리자면 instrumentation 함수를 통하여 키값을 콘솔에게 날려주는 어플은 Broadcast receiver를 받아 키값을 날려주는 기능 뿐이 없습니다. 저는 그 어플에 메세지를 날려줄 뿐입니다. 쓰레드로 돌려주는건 아니고 AsyncTask를 재귀적 함수로 루프를 돌리고 특정 상황에서 시스템 어플에게 메세지를 날려주고 리시버 어플(시스템어플)이 받아서 키값을 날리고 있습니다. 시스템 어플은 부팅과 함께 Broadcast 서비스를 실행시키고 자동 종료되기 때문에 큰 이상은 없으리라 봅니다. 시스템 어플에 제가 필요한 서비스를 넣은것 그 뿐입니다. 조금 돌아가는 듯한 기분은 들지만 핸드폰도 통신사, 제조사별로 기본어플이 다르듯 저도 그것처럼 제가 원하는 기능을 넣은 어플을 기본어플로 추가 한 것이라 생각이 듭니다. 혹시 문제가 있을것 같다고 생각하시는 부분 있으면 말씀해주시면 감사하겠습니다.
...