아티클

안드로이드 네이티브 앱에서 TalkBack에 반응하는 레이아웃 만들기

2020-06-10 15:01:46

안녕하세요, 엔비전스입니다.

각 서비스의 접근성을 고려할 때는 동일한 레이아웃에서 각 사용자의 상황에 맞는 보조기술을 이용하여 모든 기능을 이용할 수 있도록 개발하는 것이 원칙입니다. 그러나 상황에 따라서는 스크린리더 사용자를 위한 레이아웃을 별도로 구성해야 할 때가 있을 수 있습니다. 다음과 같은 경우가 해당 예에 해당합니다.

  1. 비디오 플레이어에서 영상 플레이 도중 변경되는 전체 화면 전환에 대한 대응: 비장애인의 경우에는 영상을 큰 화면으로 보기 위해 재생 시에 바로 전체 화면으로 전환하도록 화면을 구성하는 것이 필요할 수 있습니다. 그러나 이때 스크린 리더 사용자는 전체 화면으로 빠르게 전환될 경우 일시정지, 볼륨 조절과 같은 재생 컨트롤러 사용이 어렵게 됩니다.
  2. 롤링 되는 배너 컨트롤: 앱이나 화면의 특성에 따라 롤링 되는 광고를 표시해야 하는 경우가 있습니다. 이때 여러 환경에서 사용하는 사용자를 위해 롤링 되는 배너를 정지시키거나 이전 혹은 다음 배너로 이동할 수 있는 버튼들을 두면 좋겠지만 화면 구조상 버튼들을 두기 어려울 수 있습니다. 스크린 리더 사용자의 경우 배너 영역 탐색 시 배너가 계속 롤링 되는 경우 포커스를 잃어버리는 문제가 발생할 수 있습니다. 본 예시에 대해서는 아티클 하단에 제공되는 샘플 앱을 통해 확인 가능합니다.
  3. 간단한 대체 텍스트만으로는 특정 콘텐츠를 스크린 리더 사용자에게 표시할 수 없을 때: 안드로이드 네이티브 앱에서도 HTML에서와 마찬가지로 contentDescription 속성을 통해 이미지 콘텐츠에 대한 대체 텍스트를 추가할 수 있습니다. 그러나 HTML에서도 텍스트가 길거나 백그라운드 이미지로 의미 있는 콘텐츠를 표시할 수밖에 없는 경우 화면에서는 숨기고 스크린 리더만 읽을 수 있도록 스크린리더용 콘텐츠를 표시하는 경우가 있는 것처럼 네이티브 앱 화면에서도 이미지로 긴 텍스트를 표시해야 할 때 하나의 view에 긴 대체 텍스트를 추가하기보다는 여러 view로 나누어서 스크린 리더 사용자가 구조적으로 탐색할 수 있도록 해야 할 때가 있을 수 있습니다. 안드로이드 네이티브 앱에서는 HTML과 달리 화면에서는 보이지 않는 스크린 리더용 텍스트를 적용할 수 없으므로 이때는 스크린 리더에 따라 반응하는 레이아웃을 구성해야 합니다.

위에서 살펴본 예시 외에도 한 손가락 위에서 아래로 쓸어내리기를 통한 콘텐츠 새로 고침, 탭 하는 것이 아닌 밀기 동작을 통해서 실행 등의 접근성 대응에도 TalkBack 사용자를 위한 추가 레이아웃 개발을 활용할 수 있습니다.

안드로이드 접근성 API에서는 위에서 언급한 여러 상황들을 포함하여 필요한 경우 특정 접근성 서비스가 실행된 경우 혹은 어떤 접근성 서비스이든 하나라도 실행이 된 경우 특정 화면에 대한 레이아웃을 변경하거나 특정 동작을 다르게 설정할 수 있는 API를 제공하고 있으므로 필요 시 해당 API를 이용할 수 있습니다. 아래에서 구체적인 방법을 살펴보도록 하겠습니다.

 

안드로이드 접근성 서비스의 특징

스마트폰 제조사마다 화면 구성이 조금씩 다르긴 하지만 기본적으로 안드로이드 환경설정 안에는 접근성 설정 항목이 있으며 설치된 서비스 영역에는 TalkBack, 스위치 제어를 포함한 여러 접근성 서비스들이 있습니다. 안드로이드는 iOS와 달리 이러한 접근성 서비스들을 설치/삭제는 물론 심지어 필요한 경우 AccessibilityService class를 이용하여 사용자가 접근성 서비스를 개발, 접근성 서비스 카테고리에 등록할 수도 있습니다. 해당 접근성 서비스에 등록된 서비스들은 AccessibilityManager 클래스의 영향을 받습니다. AccessibilityManager 클래스는 시스템에서 발생시키는 기본적은 접근성 이벤트 외에 추가적인 이벤트를 발생시키거나(sendAccessibilityEvent) 시스템에서 접근성 서비스 실행 여부를 캐치하거나 안드로이드 10에서 추가된 액션 취하기 전 대기시간의 사용자 설정을 가지고 오는 등의 여러 메소드를 포함하고 있습니다. 따라서 어떠한 서비스든 접근성 서비스가 실행되고 있을 때는 이러이러하게 해 달라는 조건문을 설정하였다면 기본적으로 설치된 서비스 외에도 직접 개발하여 접근성 서비스에 등록이 되고 실제 사용자가 그 서비스를 활성화하는 순간 해당 조건문의 영향을 받게 됩니다.

먼저 TalkBack이 실행되고 있을 때 레이아웃을 다르게 구성하려면 다음과 같은 조건들이 필요합니다.

  1. 시스템에서 TalkBack이 켜져 있는지의 상태를 감지할 수 있어야 합니다. 이때 사용되는 클래스는 AccessibilityManager입니다.
  2. TalkBack이 실행되었을 때의 레이아웃과 그렇지 않았을 때의 레이아웃을 구상합니다. 일반적으로는 모든 요소를 다 만들어 놓고 setVisibility(View.INVISIBLE), VISIBLE 속성을 사용하여 조건에 맞게 보이거나 숨깁니다.
  3. 조건문을 통해 TalkBack이 실행되었을 때와 그렇지 않았을 때의 어떤 부분이 어떻게 표시되거나 실행되게 할지를 알려줍니다. 예: 화면을 불러올 때 TalkBack이 실행되어 있다면 화면에 숨어 있던 배너 일시정지, 이전 배너 보기, 다음 배너 보기를 표시해 주세요.
  4. TalkBack이 실행되고 있는지를 시스템에서 판단하는 것은 해당 화면을 불러올 때입니다. 즉 이미 실행이 된 상태에서 TalkBack을 끄거나 켜더라도 이미 화면이 불러온 상태이므로 최초 실행된 그 상태의 레이아웃을 유지합니다.
  5. 개발 시에는 조건문 설정 시 접근성 서비스 중 특정 서비스에 국한된 조건문으로 설정을 할 것인지 혹은 접근성 서비스는 무엇이든 실행된 것을 조건문으로 설정할 것인지를 결정해야 합니다.

 

코드 적용방법

코드 적용방법
문법 설명
import android.view.accessibility.AccessibilityManager; AccessibilityManager 클래스를 가져옵니다.
AccessibilityManager am = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE); 가지고 온 AccessibilityManager class를 이용하여 시스템에 설치된 접근성 서비스 리스트를 대상으로 객체를 만듭니다. 여기서 am은 임의로 설정한 객체 이름이며 am은 이제 접근성 서비스 리스트를 가지게 됩니다.

boolean isAccessibilityEnabled = am.isEnabled();

boolean isExploreByTouchEnabled = am.isTouchExplorationEnabled();

AccessibilityManager class의 메소드 중에서 접근성 서비스 혹은 TalkBack이 실행되고 있는지를 확인해야 하므로 조금 전 am이라는 임의의 이름으로 만든 객체에 조건문으로 사용할 메소드를 가지고 옵니다. 코드의 네이밍에서도 알 수 있듯이 앞의 TouchExplorationEnabled는 TalkBack이 실행되는 여부를 판단하기 위한 메소드이며 뒤의 AccessibilityEnabled는 어떠한 접근성 서비스든 실행되고 있을 때를 조건문으로 사용하기 위한 메소드입니다.
이제 조건문을 통해 TalkBack 혹은 접근성 서비스 중 그 무엇이라도 하나 이상이 실행되고 있을 때 이러저러하게 변경하라는 조건문을 추가하면 됩니다. if (isExploreByTouchEnabled) { 실행하고자 하는 코드 문장. 예: 숨겨진 다음 버튼을 표시해 주세요. 롤링 되고 있는 배너를 멈추세요. }

 

지금까지 AccessibilityManager class를 활용하여 접근성 서비스에 반응하는 레이아웃 만들기에 대해 살펴보았습니다. 안드로이드와 마찬가지로 iOS에서도 같은 기능을 제공하고 있으며 다음에는 iOS에서의 해당 메소드를 적용하는 방법에 대해서도 다루어 보도록 하겠습니다. 앞에서도 언급한 바와 같이 이러한 다른 레이아웃 구성은 반드시 필요할 경우에만 사용해야 하며 되도록 같은 레이아웃에서 접근성을 어떻게 향상시킬 것인지에 대한 고민이 필요합니다.

마지막으로 AccessibilityManager class의 예시를 다룬 샘플 앱을 공유합니다. 해당 샘플 앱이 본 아티클을 이해하는데 조금이나마 도움이 되셨으면 합니다.

톡백탐지 apk 파일(안드로이드 10 이상에서 설치 가능)

소스코드 다운로드

댓글 0
댓글을 작성하려면 해주세요.