일단 커널에서 keypad D/D 를 만들어서 input device로 등록 했습니다
또 리눅스의 커널과 android 중간에서 커널에서 올라온 값들을 android에서
사용되어지는 값들을 매핑해주는 qwerty.kl(<<--통칭해서 이렇게 부르겠습니다.)
위의 작업후에 대부분의 키가 정상 작동하는데 도무지 HOME키가 정상 작동을 하지 않내요
드라이버 에서 input_report_key함수로 event hub까지 올라 가는거 같구요 분명히
qwerty.kl에서도 매핑 되어지는 거같은데 이상하게 적용이 안되어 지는군요
그래서 질문 합니다
위의 작업 말고 제가 다른 작업을 할께 더 있는건가요??
아니면 android소스에서 매핑된 key값으로 "HOME"을 콜 하는 부분에 문제가 있는걸까요..
그렇다면 android소스에서 제가 어디를 봐야 key값으로 "HOME"을 콜 하는 부분을 확인할수 있을까요
아무리 찾아도 답이 없어서 이렇게 질문 드립니다
vi KeyInputQueue.java
170 public static KeyEvent newKeyEvent(InputDevice device, long downTime,
171 long eventTime, boolean down, int keycode, int repeatCount,
172 int scancode, int flags) {
173 return new KeyEvent(
174 downTime, eventTime,
175 down ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP,
176 keycode, repeatCount,
177 device != null ? device.mMetaKeysState : 0,
178 device != null ? device.id : -1, scancode,
179 flags | KeyEvent.FLAG_FROM_SYSTEM);
180 }
181
182 Thread mThread = new Thread("InputDeviceReader") {
183 public void run() {
184 android.os.Process.setThreadPriority(
185 android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);
186
187 try {
188 RawInputEvent ev = new RawInputEvent();
189 while (true) {
190 InputDevice di;
191
192 // block, doesn't release the monitor
193 readEvent(ev);
194
195 boolean send = false;
196 boolean configChanged = false;
197
198 if (false) {
199 Log.i(TAG, "Input event: dev=0x"
200 + Integer.toHexString(ev.deviceId)
201 + " type=0x" + Integer.toHexString(ev.type)
202 + " scancode=" + ev.scancode
203 + " keycode=" + ev.keycode
204 + " value=" + ev.value);
205 }
206
198번줄에 if(false)를 if(true)로 바꿔서 Log정보를 보시는게 어떨까요?
193 readEvent(ev); -> 이 부분이 아마 cpp 쪽에서 event hub인가에서 키를 읽어 오는 부분일것입니다.
if (true)하면 밑에 log로 자세한 키 값이랑 정보가 나와서 디버깅이 편할것 같습니다.
흠..테스트는 못해봐서 100%보장은 못합니다^^;
안드로이드 Key/Touch event dispatch 과정
1. 리눅스 디바이스 드라이버로 부터 키를 받아들입니다.
소스 : ~Cupcake/frameworks/base/libs/EventHub.cpp
EventHub 개체가 생성될 때 openPlatformInput() 함수는 해당 device를 open합니다
2. system_server 프로세스에서 key event를 받아들입니다.
소스 : ~Cupcake/frameworks/base/services/java/com/android/server/keyInputQueue.java
~Cupcake/frameworks/base/services/jni/com_android_server_KeyInputQueue.cpp
system_server 는 다른 Android Application처럼 zygote이 spawn하는 Dalvik VM 프로세스입니다.
KeyInputQueue (KeyInputQueue.java) 에서 Thread가 생성되어 readEvent() 를 통해이벤트가 발생하는지를 계속 체크합니다. readEvent 는 결국 JNI 를통하여android_server_KeyInputQueue_readEvent() 를 호출하여 KeyEvent를 받아들입니다
3. KeyInputQueue class에서 Thread가 생성되어 readEvent() 를 통해 발생한 이벤트를 계속 체크합니다. readEvent 는 결국 JNI 함수인 android_server_KeyInputQueue_readEvent() 를 호출합니다. 발생한 이벤트가 있으면 QueuedEvent 에 넣게됩니다.
4. 이벤트는 WindoManagerService의 InputDispatcherThread 쓰레드에 의해서 큐에서 가져오게 됩니다. 이 이벤트는 현재 Activity에 이벤트를 전달하게 되고 Activity Looper는 해당 이벤트를 View에 전달하게 됩니다.
어디서 긁어 온건데.출처가..기억이.-.-;;
'온라인게임' 카테고리의 다른 글
stdafx / std a fx / Standard Application Freamworks / MFC (0) | 2010.10.14 |
---|---|
어플실행중 Home Key눌렀을때 [멀티테스킹 질문] (0) | 2010.10.13 |
빨리 싸게 멋지게 (0) | 2010.10.13 |
About STL : C++ STL 프로그래밍(4)- 벡터 Vector (0) | 2010.10.12 |
vector vs list (0) | 2010.10.12 |
이 말이 어렵다...!!!!
[슬립 Hold]
1.Hardware Hold key 를 누르면
---onWindowFocusChanged()
---onSaveInstanceState()
---onPause()
2.해제 : Hardware Hold key 를 누르면
---onResume()
---onWindowFocusChanged()
[팝업창]
1.Hardware Home Key를 길게 누르면.....
---onWindowFocusChanged() ->
2.... 이상태에서 Back누르면 돌아오면..
---onWindowFocusChanged() ->
[팝업창 2]
기타..그냥 Homekey 누르기...또 실행시...????????