2013-06-14 1 views
3

소프트 키보드 감지 또는 KeyEvent 감지와 관련된 대부분의 게시물을 읽었습니다. 나는 시야의 크기를 측정하는 것과 같은 방법을 보았다. 그러나, 제 경우의 문제는 소프트 키보드가 열려 있는지 또는 KeyEvent가 "서비스"를 사용하는지 감지하고 싶습니다. 그것은 서비스를 통해 가능합니까? 아니면 누군가가 활동에 타이핑하고 있음을 감지 할 수 있습니까? 나는 연구를하고 있으며, 활동에 타이핑을하는 것을 포함하는 전화로 몇 가지 활동을 기록해야합니다. 감사!소프트 키보드 감지 중/서비스를 사용하는 KeyEvent

답변

5

"일종의"까다로운 방법을 찾았습니다. 그러나 이것은 당신이 그 힘을 가지고 있다면 당신의 사용자가 당신을 위해 무언가를 할 것을 요구한다. :) 그래서 분명히 이것은 당신의 모든 문제를 해결하지 못할 것이다.

내 까다로운 방법은 AccessibilityEvent을 사용하는 것입니다. 청취하려는 이벤트를 지정할 수 있습니다. TYPE_WINDOW_CONTENT_CHANGED되는 창 크기와 관련된 이벤트 중 하나

공공 정적 최종 INT TYPE_WINDOW_CONTENT_CHANGED만큼 앱 사용자의 접근성 서비스가 활성화 될 때

Added in API level 14 
Represents the event of changing the content of a window and more specifically the sub-tree rooted at the event's source. 

Constant Value: 2048 (0x00000800) 

, 당신은받을 것이다 이것은 (아래 참조) 행사.

이 이벤트를 청취하려면 자신의 AccessibilityService를 시작해야합니다. 빌드 방법은 this을 참조하십시오. 그런 다음 어떤 액세스 가능성 이벤트를 수신할지 지정할 수 있습니다. 당신은 XML 파일 중 하나를 지정할 수 있습니다

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:packageNames="MypackageName" 
    android:accessibilityEventTypes="typeWindowStateChanged" 
    android:accessibilityFeedbackType="feedbackSpoken" 
    android:notificationTimeout="100" 
/> 

또는 onServiceConnected 방법

:
protected void onServiceConnected() { 
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();  
    info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; 
} 

그런 다음 당신은 방법 onAccessibilityEvent (이벤트)의 이벤트를 받게됩니다. 그러나이 방법에는 두 가지 단점이 있습니다. 윈도우 상태가 변경 될 때마다 이벤트가 발생 될 때마다

  1. 이 있습니다.
  2. 사용자는 [설정] -> [접근성] -> [서비스]에서 접근성 서비스를 활성화해야합니다.

다시 말하면,이 방법은 특정 목적으로 만 작동합니다. 하지만 "서비스에서"소프트 키보드를 감지하고 싶지는 않지만 사용자의 활동이 아닌 경우에는 작동합니다.

+0

저는 이것이 잘 알려진 문제에 대한 첫 번째 좋은 반응이라고 생각합니다. 감사합니다 – BQuadra

+1

당신의 예제 코드에서'TYPE_WINDOW_CONTENT_CHANGED'을 사용하지 않았습니다 ;-). 그러나 서비스에서이 이벤트가 발생하면 'TYPE_WINDOW_CONTENT_CHANGED' 이벤트가 키보드로 인해 발생했는지 어떻게 판단 할 수 있습니까? – prom85

+0

불행히도 'TYPE_WINDOW_CONTENT_CHANGED'는 활동 변경과 같은 다른 많은 이벤트에 의해 시작됩니다. 'TYPE_VIEW_FOCUSED' 및/또는'TYPE_VIEW_CLICKED'는 EditText가 처음으로 포커싱/터치 될 때, 즉 키보드가 사용자를 위해 열릴 때 발생합니다. 그러나 키보드가 닫히면 이벤트가 시작되지 않으므로 접근성 서비스에서 키보드가 열려 있는지 여부를 감지 할 수 없습니다. 그러나 사용자가'EditText'에'TYPE_VIEW_TEXT_CHANGED'의'EventType'과'android.widget.EditText'의'ClassName'을 더한 새로운 문자를 입력하면이를 감지 할 수 있습니다. –