Android Accessibility 개발은 매우 복잡하다. Accessibility조차 Android의 일부이다.
→ 구글 팀이 할 일은 복잡성을 다루지 않도록 하는 것
세션의 목표
대부분이 시각 장애인을 위한 Accessibility에 대해서 먼저 시작한다.
추가 도구 및 손쉬운 사용 없이 정보를 잘 보이게 하는 것은 어렵다.
색맹인 사람들에게는 전달하려는 정보가 누락
UI를 보고 내용을 이해할 수 있을 때 UI를 사용할 수 있을까?
이때 컨트롤의 변화로 큰 차이를 만들 수 있다.
작은 공간에 많은 기능을 추가하면 누군가는 어려움을 겪게 된다. (ex, 손가락이 커서 UX 경험이 나쁜 경우)
→ 중요한 정보는 크고 이해하기 쉽게 컨트롤할 수 있도록 해야 한다.
화면을 볼 수 없는 사용자를 돕기 위해서는 많이 생각해야 한다. 이미지 사용 시, 전혀 볼 수 없는 사람에게도 효과가 있는지 체크해야 한다.
사용자가 앱과 상호 작용하는 방식에서 본질적으로 두 가지가 있다
앱 개발 단계 (선결제를 위한 사람들을 타겟팅)
이런 장애가 조합적인 사람들도 있다.
전 세계에는 10억 명의 장애를 가진 사람이 있지만, 10억 개의 사례를 기준으로 하지 않아도 된다. 이런 생태계에서 Accessibility Service
를 통해 많은 사례에 맞게 확장할 수 있도록 지원한다. Accessibility Service는 Android Platform에 대한 플러그인이며, 사용자 대신 UI에 대한 정보를 얻거나 액션을 취할 수 있다.
특정 사용자에게 맞게 정보를 제공하는 방법을 제시한다.
동작 방식은 Android Framework를 통해서 처리한다.
API를 사용하여 정보를 제시하고 사용자가 Action을 하도록 하는 것이다. 그런 다음 테스트 도구를 사용하여 실제로 동작하는지 확인한다.
Accessibility Service와 통신하는 방법은 Accessibility API
를 사용하는 것이다. 대부분은 뷰 계층을 통해서 유추할 수 있다. 그러나, 위와 같은 옵션 버튼은 Android Framework는 화면의 위치 및 클릭 가능한 정보 등을 View.java
를 통해 유추할 수 있다.
화면을 볼 수 없는 TalkBack
사용자는 이 항목에 손가락을 대면 아무것도 얻지 못한다. TalkBack이 해당 상황에서 무엇을 말해야 하는지 모르기 때문이다. 그것은 Description Text가 없기 때문이다.
ContentDescription API를 통해서 설명을 추가할 수 있다. Localized 된 문자열을 전달하면 된다. 누군가는 문자열을 들어야 하므로 현지화와 간결한 설명이 필요하다.
추가 옵션 버튼이라는 것을 알게 되었으며, 원하던 상호작용을 이어나갈 수 있다.
다른 예로는, 이메일 UI에서 스와이프로 이메일을 삭제/읽음을 표시할 수 있다. 스와이프하면 해당 이메일은 삭제된다. 그러나 모든 사용자가 탭/스와이프를 할 수 있는 것은 아니다.
Accessibility Service
를 통해서 각 케이스에서 할 수 있는 작업을 알 수 있다.
ContentDescription과 유사하게 Accessibility API
를 사용하면 된다.
View, 지역화된 문자열, 사용자 요청 시 수행할 Lambda를 전달하여 정의한다.
ViewCompat#addAccessibilityAction
API를 사용함으로 스위치 사용자가 Select/Remove 작업을 모두 수행할 수 있다.
AndroidX API이므로
API 21 이상
에서 동작한다.
Android O 이전에는 Accessibility Frameworks가 텍스트 링크 혹은 ClickableSpans 사용 시 URL이 아닌 범위에 대해 처리를 할 수 없었다. TalkBack 사용자는 화면에 링크가 있다는 메시지가 표시되지 않는 문제가 발생했다.
해당 문제를 해결하기 위해 AndroidX에 API가 추가되었다.
ViewCompat#enableAccessibleClickableSpanSupport
API 19 이상
에서 동작한다.
정상적으로 적용된 경우의 화면
Dialog가 아니라 ViewGroup 과 텍스트와 버튼의 조합으로 구현하는 경우, 상황에 따라 시각적으로 표현하는 정보가 결정되므로 TalkBack과 같은 Accessibility Service에 문제가 발생한다.
이 경우, 해결방법은 ViewGroup에 Accessibility을 제공하는 것이다.
[ViewCompat#setAccessibilityPaneTitle](https://developer.android.com/reference/androidx/core/view/ViewCompat#setAccessibilityPaneTitle(android.view.View,%20java.lang.CharSequence)
API 19 이상
에서 동작한다.
이제 TalkBack을 통해서 올바르게 음성으로 알려준다.
비디오 플레이어에서 재생 버튼 등이 일정 시간이 지나면 사라지는 컨트롤이 있는 것은 일반적이다. 대부분 콘텐츠를 원하기 때문에 유용한 기능이다.
그러나, 컨트롤과 상호작용하는데 시간이 걸리는 Accessibility 사용자를 위해서 재생 버튼을 화면에 다시 표시하는 방법을 찾아야 한다. Timeout으로 사라지기 전에 상호 작용하는 방법을 찾아야 한다.
필요한 것은 상황에 따라 이상적으로 필요한 Timeout 시간을 조정하는 방법이다.
사용자가 반응할 시간을 줄 수 있도록 최소한이 시간 동안 컨트롤을 화면에 유지해야 합니다.
적용된 사례 : SnackBar#Duration
화면에서 볼 수 없는 음성 안내 지원 사용자를 위해 특별히 제작한다는 가정을 해보겠습니다. 새 이메일이 나타날 때 어떤 경험이 될지 정하려고 합니다. 가장 좋은 방법은 알리는 것이다.
새 이메일이 나타날 때마다 알리는 것은 좋은 방법이 아니다. UI 변경사항은 Accessibility Service 및 사용자 설정에 따라 다르게 표현된다.
Service는 Application의 Accessibility UI를 조정할 필요가 없다.
이해하기 쉬운 사용자를 위해 스스로 조작할 수 있는 일반적인 UI 표현이 필요하다.
이때 우리는 아무것도 하지 않는다.
AndroidX 및 Material 등의 Framework에서 제공하는 위젯을 사용하여 이를 처리할 수 있다. 해당 위젯에 기본적으로 Accessibility 관련 기능이 내장되어 있다. 그러나, 커스텀 위젯을 만드는 경우 Accessibility 이벤트
를 사용해 UI 변경 사항의 정확한 의미를 전달해야 한다.
이 상황에서 기억해야 할 것은 사용자와 직접 주고받지 않는다. Accessibility Service
와 작업을 한다.
그리고, Accessibility focus를 관리하는 것을 선호하기도 한다. 이것 또한 나쁜 선택이다. Accessibility focus
는 Accessibility Service에 의해 결정되어야 한다. 알림과 마찬가지로 경험에 일관성이 없다. 실제로 Accessibility 사용자가 직면하는 가장 큰 문제 중 하나이다. 앱은 시간이 지남에 따라 일관성이 없어진다.
앱 개발에서 Accessibility Service를 이용하지 않는 경우, Accessibility 사용자는 매 앱을 열 때마다 Accessibility에 대한 기대를 버린다. 그리고, 새로운 UI를 근본적인 수준에서부터 다시 배워야 한다. Accessibility 사용자를 위해 할 수 있는 최선의 방법은 시간이 지남에 따라 시스템과 일관성을 유지하는 것이다.
Accessibility 적용할 것이 올바른지 어떻게 알 수 있을까? 대부분의 사용자가 사용할 수 있는 환경을 만들 방법은 아래와 같다.
대부분의 Android Accessibility 테스트 도구는 Android Accessibility Service Test Framework에서 지원한다. Java 라이브러리이며, 런타임시 Accessibility 문제에 대해 Android UI 항목을 평가하기 위해 Rule 기반으로 작성된다. 오픈 소스라는 장점이 있다.
Test Framework는 아래와 같은 것을 테스트한다.
Accessibility Test Framework를 Espresso/Robolectric을 통해서 사용할 수 있다. 테스트에서 뷰와 상호 작용 시 Accessibility 검사는 실행 전에 자동으로 확인한다. 버튼과 상호작용 시 버튼 및 주위의 UI를 통해 Accessibility 문제를 찾는다.
Espresso에서는 AccessibilityChecks.enable()
으로 테스트를 활성화할 수 있다.
뷰와 직접 상호 작용하는 경우 Accessibility 검사를 무시한다.
Robolectric의 경우 AddAccessibilityChecks 주석을 사용하여 테스트를 활성화된다. ShadowView를 호출하면 View에서 테스트가 호출된다.
Espresso와 마찬가지로 Robolectric의 Accessibility 도구를 사용하여 테스트를 재정의할 수 있다.
초기 단계는 자동화된 테스트, 코드 변경, Accessibility 문제 파악 등이 전부였다. 자동화 도구이며 기술 지식이 필요하지 않다.
이 도구는 여러 물리적 장치에서 앱을 제어하고 Accessibility 문제를 찾아서 앱 출시 전에 해결할 수 있는 자동화 도구이다. Crash, Performance, Accessibility 문제를 찾는다.
이 검사는 모든 Play Store에 출시된 모든 APK에서 실행된다. 사전 출시 보고서
는 Google Play 콘솔에 있다. 사전 출시 보고서에서 문제를 파악할 수 있다.
사전 출시 보고서에서 생성된 보고서의 상세화면이다. 대비가 잘못된 텍스트가 강조 표시되어 개선을 위한 제안이 제공된다.
Accessibility Scanner
는 UI를 스캔하여 Label 누락, 작은 터치 등과 같은 잠재적 Accessibility 문제를 찾는 또 다른 앱이다. Accessibility Scanner를 사용하기 위해서 코드를 변경할 필요는 없다. Play Store에서 앱을 다운로드하거나 g.co/accessibilityscanner
에 방문하면 된다
Accessibility Scanner를 실행하면 파란색 Floating 버튼이 나타난다. 앱을 스캔하려면 UI가 Foreground에 있는 동안 파란색 버튼을 누르기만 하면 된다.
Accessibility Scanner에서 작성된 보고서의 모습이다. 예로는 잘못된 비율로 강조 표시된 텍스트를 볼 수 있다. 그리고 개선을 위한 제안도 제공한다. 이메일과 Google Drive로 보고서를 공유할 수 있다.
자세히 알아보기
를 선택하면 관련된 상세 문서로 이동한다.
자동화 테스트는 유용하지만 특정 제한 사항이 있다.
보조 기술을 사용해 앱과 상호 작용하는 방법을 이해하는 것이다. 이를 달성하는 방법은 여러 가지가 있다.
앱에서 작업할 때 실제로 요청하는 것은 다른 사람이 앱을 사용하도록 도와주고 다른 Accessibility Service 개발자가 다른 사람이 앱을 사용하도록 도와주는 것이다.
3가지로 정리할 수 있다.
Accessibility 테스트에 도움이 되는 자료
comments powered by Disqus
Subscribe to this blog via RSS.
LazyColumn/Row에서 동일한 Key를 사용하면 크래시가 발생하는 이유
Posted on 30 Nov 2024