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.html 와 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/accessibility/TaskBackService.html 에서 얻을 수 있다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] Android 는 View 를 어떻게 그리는가? (0) | 2012.06.12 |
---|---|
[Android/안드로이드] Layout 에 대하여.. (0) | 2012.06.11 |
[Android/안드로이드] 시각장애인을 위한 키보드. "Eyes free keyboard". (0) | 2012.06.11 |
[Android/안드로이드] App을 accessible 하게 만들기 ( 장애인을 위한 앱 만들기 ) (0) | 2012.06.11 |
[Android/안드로이드] Custom View 에 대하여.. (2) | 2012.06.11 |
댓글