본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Accessibility Service 에 대하여.

by 돼지왕 왕돼지 2012. 6. 11.
반응형


http://developer.android.com/guide/topics/ui/accessibility/services.html 

- Accessibility service 는 장애인들을 도와주기 위한 강화된 interface 를 제공하는 녀석이다. Android 는 TalkBack 등의 기본 accessibility service 를 제공한다. 하지만 개발자가 service 를 만들어 직접 배포할수도 있다.


- Accessibility service app 은 manifest 에 특별한 설정을 해주어야 한다.

<application>

  <service android:name=".MyAccessibilityService"

      android:label="@string/accessibility_service_label">

    <intent-filter>

      <action android:name="android.accessibilityservice.AccessibilityService" />

    </intent-filter>

  <!-- from ICS -->

  <meta-data

    android:name="android.accessibilityservice"

    android:resource="@xml/accessibility_service_config" />

  </service>

</application>


<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"

    android:description="@string/accessibility_service_description"

    android:packageNames="com.example.android.apis"

    android:accessibilityEventTypes="typeAllMask"

    android:accessibilityFlags="flagDefault"

    android:accessibilityFeedbackType="feedbackSpoken"

    android:notificationTimeout="100"

    android:canRetrieveWindowContent="true"

    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"

    />

 

Android 4.0 이하의 버전에서는 AccessibilityServiceInfo class 를 만들어서 setServiceInfo() 함수를 통해 runtime 으로 Accessibility event 를 만들어 관리할 수 있다. 하지만 제약사항이 많다.


- Accessibility service event 에서 가장 중요한 것은 해당 service 에서 어떤 event 들을 처리할 것인가이다. event filter 는 PackageName 과 EventType 두가지로 이루어진다. packageName 은 accessibility event 를 수신할 app 의 packageName 을 명시하는데, packageName 이 null 일 경우에는 모든 app. 으로부터 event 를 받을 수 있다. 여러개의 app 에 대해 작동하게 하려면 , 로 구분하여 listing 한다.


- Accessibility service 는 반드시 AccessibilityService 를 상속하고, 다음의 함수들을 override 해야 한다. 

* onServiceConnected(). 필요시 구현하는 녀석으로, accessibility service 가 연결되었을 때 불린다. setServiceInfo() 를 부르기 좋은 위치로, service setup 을 위해 한번 불린다. 여기서는 보통 audio manager 나 device vibrator 들을 initialize 한다.

* onAccessibilityEvent() 는 AccessibilityEvent 를 detect 했을 때 불리는 함수로, 이곳에서 event 처리를 해주면 된다. life cycle 동안 가장 불리는 함수가 될 것이다.

* onInterrupt() 는 system 이 service 가 하는 일을 멈추고 싶을 때 call 한다. 보통 user 가 하는 action 에 대해 호출되는데, 예를 들면 focus 를 옮긴다던지.. 이녀석도 life cycle 동안 많이 불릴 것이다.

onUnbind() 는 필요시 구현하는 녀석으로 accessibility service 는 닫을 때 줄린다. 보통 resource 정리 등에 쓰인다.


- Android system 은 AccessibilityEvent 를 통해서 UI 에 대한 정보를 전달한다. 4.0 이전에서는 Event 에 많은 내용을 담지 못했지만, 4.0부터는 더 많은 내용들을 담을 수 있다. 4.0부터는getRecordCount(), getRecord( int ) 를 통해서 AccessibilityRecord object 를 얻을 수 있고, getSource() 를 통해 AccessibilityNodeInfo 를 얻을 수 있다.
 

- AccessibilityEvent 를 통해서 전체 view hierarchy 를 얻어올 수도 있는데, 이것은 privacy 를 침해할 수도 있다. 그래서 default 로 이 기능은 꺼져있는데, android:canRetrieveWindowContent="true" 를 설정해줘야 full view hierarchy 를 얻어올 수 있다. 이 feature 가 켜져있지 않는다면 getSource() 가 실패한다.


- example code 들은 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/accessibility/ClockBackService.htmlhttp://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/accessibility/TaskBackService.html 에서 얻을 수 있다.





반응형

댓글