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

[Android/안드로이드] App을 accessible 하게 만들기 ( 장애인을 위한 앱 만들기 )

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


- Android 는 장애인들을 위해 TTS ( Text-To-Speech ), Haptic Feedback, Trackball, D-pad navigation 등을 제공한다. 이것을 Accessible 이라 한다. 이 기능들은 accessibility feature 를 on 해주어야 사용 가능하다.


- Accessibility 를 위해 다음의 것들을 해주는 것이 좋다.
 
 * IamgeButton, IamgeView, EditText, CheckBox 등에 android:contentDescription 속성을 채워넣어 label 을 제공하는 것이 좋다. 이 녀석이 소리로 시각장애인에게 전달될 수 있다.

 * 모든 UI component 들이 trackball 이나 D-pad 로 조작 가능하도록 하는 것이 좋다.

 * Accessibility feature 를 켜고 test 를 해보는 것이 좋다.


- Custom view 를 만들 때, accessibility 를 위해 다음과 같은 것을 해주는 것이 좋다.

 * directional controller click 을 처리

 * Accessibility API 구현

 * AccessibilityEvent 를 custom view 에 전달하기

 * AccessibilityEvent 와 AccessibilityNodeInfo 를 수집하기


- Accessibility event 는 Accessibility service 에 의해 처리된다. Android 1.6 ( API Level 4 ) 부터 AccessibilityEventSource 를 통해 event 를 생성할 수 있었지만, Android 4.0 ( API Level 14 ) 부터는 View.AccesssibilityDelegate class 를 이용해서 확장된 event 를 생성할 수 있다.


- sendAccessibilityEvent() 는 user 가 view 에 어떤 action 을 가했을 때 불린다. 예를 들면 TYPE_VIEW_CLICKED. custom view 를 만드는 것이 아니라면 꼭 구현하지 않아도 된다.


- sendAccessibilityEventUnchecked() 는 System 에서 accessibility feature 가 eanble 되었을 때를 감지하여 불린다. ( AccessibilityManager.isEnabled() 를 통해 enalbe 여부를 알 수 있다. ) custom view 는 구현하지 않아도 됩니다.


- dispatchPopulateAccessibilityEvent() 는 custom view 가 accessibility event 를 생성했을 때 불린다. 해당 view 의 onPopulateAccessibilityEvent() 가 먼저 불리고, child의 dispatchPopulateAccessibilityEvent() 가 그 다음으로 불린다.

 
- onPopulateAccessibilityEvent() 는 AccessibilityEvent 의 text output 을 set 한다. 이 함수에서 다른 property 들을 modify 하면, overwrtie 가 되기 때문에, 가능하면 text를 제외한 다른 attribute 수정은 onInitializeAccessibilityEvent() 를 통해 하는 것이 좋다. 이 함수에서 text 만을 바꾸고 다른 변동사항은 주고 싶지 않다면 super 를 콜하지 않는 것이 좋다.


- onInitializeAccessibilityEvent() 는 view 의 text를 제외한 추가적인 정보를 얻기 위해 호출된다. 복잡한 interactive control 을 사용할 때에는 password field type, checkbox type, state 등을 feedback 으로서 입력해주는 것이 좋다. 이 녀석은 super 를 call 해주고, 추가적으로 set 하는 녀석만 구현해주는 것이 좋다.


- onInitializeAccessibilityNodeInfo() 는 view state 에 관련된 정보를 accessibility service 에 제공하는데 사용된다. 간단하지 않은 custom view 의 경우에는 추가 정보를 입력해주는것이 좋다.





- onRequestSendAccessibilityEvent() 는 child 가 AccessibilityEvent 를 생성했을 때 call 된다. 이 함수를 통해 부모뷰에서 추가정보를 수정할 수 있다. 이녀석은 custom view 에서 child 가 event 를 생성했을 때, 부모가 context 정보를 추가로 제공하고자 할 때 주로 사용된다.


- Android 4.0 이상에서는 위의 함수들을 바로 override 해서 사용하면 되지만, 1.6 버전까지 호환이 되기 위해서는 ViewCompat.setAccessibilityDelegate() 함수를 이용하여 위의 함수들을 구현해주어야 한다. 다음의 함수들은 custom view 라면 대부분 구현해야 한다. dispatchPopulateAccessibilityEvent(), onPopulateAccessibilityEvent(), onInitializeAccessibilityEvent(), onInitializeAccessibilityNodeInfo().


- API Level 4~ 는 TYPE_VIEW_CLICKED, TYPE_VIEW_LONG_CLICKED, TYPE_VIEW_FOCUSED 가 event 로 전달되고 API Level 14~ 는 TYPE_VIEW_SCROLLED, TYPE_VIEW_HOVER_ENTER, TYPE_VIEW_HOVER_EXIT 가 추가로 제공된다. 


- Custom view 의 content 가 바뀔때마다 AccessibilityEvent 는 전달되어야 한다. 
 

- AccessibilityEvent 는 현재 view 의 상태를 포함해야 하는데, 예를 들면 class name, content description, checked state 등이 그것이다. Android 4.0 이상에서는 text 내용은 주로 onPopulateAccessibilityEvent() 에서, 추가 내용은 onInitializeAccessibilityEvent() 를 통해 입력된다. text 내용은 보통 TalkBack 등의 accessiblity service 를 통해서 audio 로 전환된다. 하지만, 하위호환성을 위해서 dispatchPopulateAccessibilityEvent() 에서 text 내용을 기술해주기도 한다.


- audio feedback test 는 Android 4.0 이상에서는 default 로 가능하고, TalkBack 이 pre-install 된 단말에서도 test 가능하다. 4.0 이하에서 TalkBack 을 enable 시키려면, [Setting] - [Accessibility] - [Accessibility] - [TalkBack] 을 하면 된다. ( 만약 TalBack 이 없다면 Google Play 를 통해서 install 하면 된다. ) Explore by Touch 를 enable 하려면, [Setting] - [Accessibility] - [TalkBack] - [Back] - [Explore by Touch] 를 하면 된다.




반응형

댓글