2014-02-26 1 views
3

크기가 1 인 윈도우를 구현했으며 ACTION_OUTSIDE 이벤트를 잡으려고합니다.KitKat 4.4.2에서 ACTION_OUTSIDE가 매번 0을 반환하는 이유는 무엇입니까?

mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(1,1, 
WindowManager.LayoutParams.TYPE_PHONE, 
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| 
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| 
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
PixelFormat.TRANSLUCENT);  

나는 방아쇠를 얻고 나는 ACTION_OUTSIDE 이벤트를 얻을 수 있지만, event.getRawX()event.getRawY()를 읽을 때 그들은 둘 다 0마다 돌아갑니다. 인조 인간 2.3.6으로 같은 것을 테스트 해 보았습니다. 그리고 나는 더 이상 사용되지 않는 것을 찾을 수 없습니다.

Android 문제입니까 아니면 누구에게 해결책을 알고 있습니까? 들으

답변

2

Tniederm, 내가 참조를 위해 비슷한 질문 here 대답,하지만 약간의 편집을 여기 재탕 것 :

:

소스 코드를 수색 한 후, 나는 문제의 원인을 발견

https://github.com/android/platform_frameworks_base/blob/79e0206ef3203a1842949242e58fa8f3c25eb129/services/input/InputDispatcher.cpp#L1417

// Check whether windows listening for outside touches are owned by the same UID. If it is 
// set the policy flag that we will not reveal coordinate information to this window. 
if (maskedAction == AMOTION_EVENT_ACTION_DOWN) { 
    sp<InputWindowHandle> foregroundWindowHandle = 
      mTempTouchState.getFirstForegroundWindowHandle(); 
    const int32_t foregroundWindowUid = foregroundWindowHandle->getInfo()->ownerUid; 
    for (size_t i = 0; i < mTempTouchState.windows.size(); i++) { 
     const TouchedWindow& touchedWindow = mTempTouchState.windows[i]; 
     if (touchedWindow.targetFlags & InputTarget::FLAG_DISPATCH_AS_OUTSIDE) { 
      sp<InputWindowHandle> inputWindowHandle = touchedWindow.windowHandle; 
      if (inputWindowHandle->getInfo()->ownerUid != foregroundWindowUid) { 
       mTempTouchState.addOrUpdateWindow(inputWindowHandle, 
         InputTarget::FLAG_ZERO_COORDS, BitSet32(0)); 
      } 
     } 
    } 
} 

외부 접촉을 수신 년대보기, 이벤트와의 UID (read about it here)를 공유하지 않는 뷰에서 "외부 터치"토지의 경우 디스패처는 좌표를 0,0으로 설정합니다. 이것은 보안 목적으로 수행되었지만 완화 할 수있는 위협의 전체 범위를 확신 할 수는 없습니다. 이전 버전의 InputDispatcher를 검색하여이 기능이 언제 도입되었는지 알아볼 수 있습니다. 나는 스스로를 보지 않았습니다.

따라 가려면 버그 티켓을 열었습니다. 최소한이 문서에는이 정보가 포함되어야합니다.이 보안 기능이 정말로 필요한지 알고 싶습니다. 내 학사 논문에서

Issue 72746: FLAG_WATCH_OUTSIDE_TOUCH doesn't return location for ACTION_OUTSIDE events on 4.2+

+0

나는 좌표를 추출하기 위해이 기능을 사용하는 키로거 (keylogger)을 개발했다. 그래서 여기서 보안 문제를 봅니다. 대답을 주셔서 감사합니다 – tniederm

+0

오, 그래? 시원한! 나는 이것이 keylogger를 만드는 데 사용되는 것을 볼 수 있지만, 내 질문은 : 당신이 그것으로부터 얻는 데이터가 얼마나 유용할까요? 사용자가 어떤 다른 앱을 설치했는지, Launcher 페이지에있는 위치를 알 수 있습니까? 기본적으로 어떻게 탭하고 있는지 어떻게 알 수 있습니까? 오, 내 대답에 만족한다면 답변으로 표시하십시오. 감사! – Halogen

+0

GetTask 권한을 사용하여 현재 작업을 가져옵니다. 이 정보로 당신은 매우 강력한 keylogger 있습니다. 천만에요! – tniederm

관련 문제