아티클

안드로이드 플랫폼에서 적용할 수 있는 시간 연장 관련 접근성 API 살펴보기

2020-08-18 11:31:38

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

접근성을 고려할 때의 중요한 이슈 중 하나는 시간제한이 있는 콘텐츠에 대한 부분입니다. 접근성이 잘 되어 있다 하더라도 보조기술을 이용하여 서비스를 이용하는 사용자의 경우에는 보조기술을 사용하지 않는 사용자보다는 특정 과업을 수행하는 데 조금 더 시간이 많이 소요되는 경우가 많기 때문입니다. 그뿐만 아니라 저시력 사용자의 경우에는 화면에 특정 시간 동안 잠깐 표시되었다가 사라지는 토스트 형태의 메시지 역시 화면에서 너무 빨리 사라지는 경우 알림 메시지를 다 읽지 못하는 경우도 많습니다.

일반적으로 웹페이지에서는 시간제한이 있는 콘텐츠의 경우 시간 연장 버튼을 두고 로그인 만료, 인증 만료 직전에 팝업을 통해 이를 알리도록 하는 것이 기본적인 해결 방법입니다. 사실 이러한 방법은 웹뿐만 아니라 모든 플랫폼에서 유효한 해결 방법 중 하나입니다.

그런데 오늘 본 아티클에서 다룰 내용은 안드로이드 접근성 API에서 지원하는 getRecommendedTimeoutMills 메소드입니다. 이 메소드를 사용하면 시간 연장과 관련된 UI 구현을 별도로 하지 않더라도 사용자의 접근성 설정에 따라 최대 2분까지 시간 연장이 가능합니다. 따라서 본 문서에서는 해당 메소드 사용 방법과 장점, 적용 방법, 유의사항에 대해 살펴보도록 하겠습니다.

 

조치를 취할 시간 변경 설정

안드로이드 버전 10부터는 접근성 설정 메뉴에 조치를 취할 시간 변경 설정(Change time to take action) 기능이 추가되었습니다. 말 그대로 시간제한이 있는 콘텐츠 표시 시간을 접근성 설정에서 제어하는 설정입니다. 시간제한이 있는 콘텐츠에는 텍스트, 상호 작용이 가능한 컨트롤, 아이콘 등이 있습니다.

안드로이드의 접근성 메뉴는 각 스마트폰 제조사마다 나름대로 수정을 하기 때문에 메뉴 위치 및 번역 문구는 다릅니다. 예를 들어 구글 픽셀에서는 상호작용 섹션 하위에 위치하고 있으며 갤럭시 스마트폰에서는 고급 설정에 해당 기능이 위치합니다. 번역 문구 또한 픽셀에서는 ‘조치를 취할 시간’으로, 갤럭시 스마트폰에서는 ‘액션 취하기 전 대기시간’으로 번역되어 있습니다.

이 기능은 말 그대로 시간제한이 걸려 있는 콘텐츠가 표시되었을 때 접근성 서비스를 사용하는 경우에도 시스템의 기본 설정을 따를 것인지 아니면 사용자의 특성에 맞게 강제로 특정 시간만큼 더 오래 표시되도록 할지를 설정하는 기능입니다. 기본, 10초, 30초, 1분, 2분 옵션 중에 설정이 가능하며 ‘기본’은 시스템 기본 설정을 따라간다는 의미입니다.

본 설정을 테스트하기 위한 가장 쉬운 방법은 접근성 서비스를 실행한 상태에서 디바이스 볼륨 키를 눌러 볼륨 설정 팝업이 표시되게 한 다음 자동으로 팝업이 사라지는 시간을 확인하는 것입니다. 기본적으로는 약 10초 후에는 팝업이 사라지지만 접근성 설정에서 1분 등으로 설정하였다면 그 시간 동안 팝업이 사라지지 않습니다.

그런데 한 가지 문제가 있습니다. 접근성 서비스에서 시간제한 콘텐츠를 제어하려면 구현된 이벤트가 시간 표시 콘텐츠인지 아닌지를 알아야 합니다. 안드로이드 시스템에서 기본적으로 제공하는 Toast, SnackBar와 같은 클래스를 사용하여 알림 메시지 등을 표시하는 경우에는 해당 클래스들이 알림을 표시할 때 사용되는 네이티브 컨트롤이므로 별다른 추가 구현을 하지 않아도 되지만 타임아웃 이벤트 등을 사용해서 버튼과 같은 컨트롤들이 특정 시간이 지나면 사라지게 하거나 TextView를 사용한 팝업 메시지 등을 표시하는 경우에는 시간제한 콘텐츠라는 것을 접근성 서비스에 알려주어야 합니다. 이때 사용되는 메소드가 바로 getRecommendedTimeoutMills 입니다.

 

getRecoomendedTimeoutMills 메소드 사용방법

본 메소드는 AccessibilityManager 클래스의 하위 메소드 입니다. AccessibilityManager 클래스에 대해서는 안드로이드 네이티브 앱에서 TalkBack에 반응하는 레이아웃 만들기 아티클에서 자세히 다룬 적이 있습니다. 다이얼로그 테스트 버튼을 누르면 지정된 시간 동안 메시지가 표시되고 그 시간이 지나면 다이얼로그가 사라지는 화면이 있다고 가정해 보겠습니다. 일반적으로 시간제한이 있는 콘텐츠는 다음과 비슷하게 구현할 것입니다.

new Handler().postDelayed(new Runnable() {

       @Override

       public void run() {

           dialog.dismiss();

       }

   }, timeoutMillis);

}

여기서 timeoutMillis 객체는 화면에서 표시될 시간을 설정한 객체이며 만약 3초로 지정하였다면 다이얼로그는 3초간만 표시되고 사라질 것입니다.

그러면 이것을 접근성 서비스에게 시간제한이 있는 콘텐츠라는 것을 알리는 작업을 해보도록 하겠습니다. 먼저 AccessibilityManager 클래스로 객체를 만듭니다: AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);

위의 코드를 사용하여 저는 accessibilityManager라는 객체를 만들었습니다. 이제 시간을 담을 변수에 getRecommendedTimeoutMills 메소드를 사용하여 관련 값을 넣어 주어야 합니다. 해당 메소드에 들어가야 할 값은 접근성 설정과 관련 없이 콘텐츠가 표시될 시간, 그리고 기존 시간이 초과되었을 때 접근성 설정에서 지정한 시간 동안 남아 있어야 하는 것은 어떤 것이 있는지 플래그를 지정합니다. 예를 들어 접근성 설정과 관계없이 화면에 표시될 시간은 3초이고 3초 이후부터 접근성 서비스에서 설정한 시간 동안 화면에 유지하고 있어야 하는 콘텐츠는 버튼과 텍스트라고 한다면 다음과 같은 코드가 사용될 수 있습니다: final int recommendedTimeoutMills = accessibilityManager.getRecommendedTimeoutMillis(3000, FLAG_CONTENT_TEXT | FLAG_CONTENT_CONTROLS);

getRecommendedTimeoutMills 메소드에서 사용할 수 있는 플래그는 텍스트, 컨트롤, 아이콘 3가지입니다.

 

유의사항

지금까지 안드로이드 플랫폼에서 제공하는 접근성 서비스를 이용한 시간제한 콘텐츠 해결 방안에 대해 살펴보았습니다. 아래는 몇 가지 참고 및 유의할 사항들입니다.

  1. 특정 콘텐츠를 사용자가  수동으로 닫을 수 없는 경우에는 되도록 사용하지 말아야 합니다. 예를 들어 접근성 서비스를 이용하는 사용자가 대기 시간을 2분으로 설정한 상태에서 커스텀 토스트 메시지가 출력되어 특정 화면을 가리고 있는 경우 사용자는 2분 동안 다른 작업에 방해를 받게 됩니다.
  2. 사용자가 설정한 대기시간보다 실제 대기 시간이 긴 경우에는 무조건 실제 대기 시간으로 동작합니다. 예를 들어 사용자가 대기 시간을 30초로 설정했으나 서비스에서 구현한 대기 시간이 1분이라면 1분 후에 액션이 실행됩니다.
  3. TalkBack에서는 구현된 대기 시간이 10초가 되지 않는 경우 getRecommendedTimeoutMills 메소드를 추가하는 경우 대기 시간을 기본으로 설정하더라도 10초 후에 액션이 실행됩니다. 이것은 TalkBack의 버그로 보이며 갤럭시 스마트폰의 VoiceAssistant에서는 해당 현상이 발생되지 않습니다.

 

아래는 getRecommendedTimeoutMills 메소드가 적용된 샘플입니다. 본 아티클을 이해하는데 조금이나마 도움이 되었으면 합니다. 참고로 본 샘플은 안드로이드 10 버전 이상에서만 설치됩니다.

샘플 앱 다운로드

샘플 프로젝트 다운로드

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