아티클

스마트폰 네이티브 앱 하드웨어 키보드 접근성 구현하기 1부: 안드로이드

2021-02-23 11:07:52

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

PC에서 인터넷이나 응용 프로그램의 접근성에 대해 가이드 할 때 중요하게 다루는 것 중 하나는 키보드 접근성일 것입니다. 마우스 사용이 어려운 장애인 사용자의 경우에는 특정 기능을 키보드로 실행할 수 없다면 이용 자체가 불가능하기 때문입니다.

그런데 모바일 디바이스는 터치 및 제스처를 이용하여 조작하는 기기이므로 PC를 사용할 때보다는 하드웨어 키보드를 사용하는 경우가 드뭅니다. 게다가 스마트폰은 스크린리더, 스위치 제어 등을 통해서 시각장애인이나 손이 불편한 장애인도 접근성 서비스를 통해 터치 디바이스 사용이 가능하도록 지원하기 때문에 하드웨어 키보드 사용 빈도가 PC보다는 훨씬 낮은 것이 사실입니다. 그래서 모바일 접근성을 가이드 할 때 키보드 접근성에 대해서는 고려하지 않는 경우가 많습니다.

그러나 사용자의 필요에 따라 모바일 디바이스에서도 블루투스 키보드와 같은 하드웨어 키보드를 사용하는 경우도 많습니다. 대표적인 예가 긴 텍스트를 입력할 때입니다.

아무리 터치 디바이스에 익숙하다 하더라도 긴 텍스트 내용을 터치 키보드로 입력하는 것은 비장애인 입장에서도 번거로운 일입니다. 게다가 VoiceOver, Talkback과 같은 스크린 리더가 터치 제스처를 지원하지만 수십 개의 키보드 단축키를 통한 스마트폰 조작에 대한 기능도 지원하기 때문에 하드웨어 키보드를 사용하여 앱을 조작할 수도 있습니다.

따라서 모바일 접근성 지침에 키보드 관련 항목은 없지만 각 앱의 접근성을 고려할 때 iOS, android 플랫폼에서 지원하는 키보드 접근성의 특징을 이해하고 각 플랫폼에 맞게 하드웨어 키보드를 이용해서도 충분히 앱을 사용할 수 있도록 지원하는 것이 필요합니다.

본 문서에서는 플랫폼별 키보드 접근성 지원 범위를 다루며 키보드 접근성을 구현하기 위해서 어떤 부분을 개발에 반영해야 하는지에 대해 살펴보도록 하겠습니다. 1, 2부에서는 android 플랫폼을, 3부에서는 iOS 플랫폼을 다루겠습니다.

참고: 본 문서에서 언급하는 ‘키보드’라는 명칭은 모두 하드웨어 키보드를 지칭하는 것입니다.

접근성 초점과 하드웨어 키보드 초점

PC 웹 접근성을 언급할 때 자주 사용되는 키워드 중 하나는 가상 커서입니다. 웹페이지에서 탭 키를 누르면 각 요소별로 포커스가 되지만 버튼, 링크, 편집창과 같은 키보드로 조작이 가능한 컨트롤이 아닌 경우에는 tabindex 속성을 추가하지 않는 이상 탭 키를 눌러도 포커스가 안 됩니다.

따라서 스크린 리더에서는 키보드 상호 조작이 불가능한 단순한 텍스트에도 캐럿을 이동하고 내용을 탐색할 수 있도록 하기 위해 스크린 리더 제조사별로 가상커서, 브라우즈 모드 등의 개념을 도입하여 기능을 추가하였습니다. (2000년도 초반 까지만 해도 가상커서라는 개념이 제대로 도입되지 않았으므로 초창기의 홈페이지에서는 시각장애인용 페이지를 별도 제작하고 모든 텍스트에도 탭 키를 통하여 접근할 수 있도록 작업을 했던 적도 있었습니다.)

이와 마찬가지로 안드로이드에서도 키보드를 연결하여 탭, 쉬프트 탭을 누르면 안드로이드 플랫폼에서 키보드 이벤트를 가지고 있다고 생각하는 요소들, 즉 키보드 상호 작용이 가능한 요소들만 포커스 됩니다. 이것을 시스템 포커스라고 부르겠습니다.

그런데 PC와 마찬가지로 안드로이드도 키보드를 연결했을 때 키보드로 상호 작용이 가능한 요소만 포커스 된다면 TalkBack을 사용하는 스크린 리더 사용자는 단순한 텍스트뷰나 키보드와의 상호 작용이 불가능한 요소에는 포커스를 할 수 없어 키보드만으로의 내용 탐색은 불가능할 것입니다.

이를 보완하기 위해 TalkBack에서는 PC에서의 가상 커서와 유사한 가상의 접근성 포커스를 별도로 만들고 시스템 포커스가 아닌 접근성 포커스를 이동시키는 별도의 TalkBack 단축키들을 만들었습니다. 그래서 각 안드로이드 디바이스의 TalkBack 음성 안내 지원 설정 메뉴에 보면 단축키가 있습니다. 이 단축키는 키보드를 연결한 상태에서 접근성 포커스 이동을 포함한 TalkBack으로 터치 제스처가 가능한 대부분의 여러 단축키들을 안내합니다.

따라서 TalkBack 사용자는 키보드 사용 시에 PC 웹과 마찬가지로 키보드를 연결한 상태에서 키보드 상호 작용이 가능한 요소로 빠르게 이동하려면 탭 키나 쉬프트 탭 키를, 모든 요소를 하나하나 다 탐색하고 싶을 때는 TalkBack에서 제공하는 단축키를 이용할 수 있습니다.

시스템 포커스 이동 키인 탭 키나 쉬프트 탭 키 등이 아닌 TalkBack 내비게이션 단축키를 사용하여 요소를 이동하는 경우 다음과 같은 특징이 있습니다.

  1. 접근성 포커스와 시스템 포커스가 별도로 표시될 수 있습니다. TalkBack에서도 접근성 포커스가 위치한 곳에 테두리를 표시하기 때문에 시스템 포커스가 가리키고 있는 요소와 접근성 포커스가 가리키는 요소가 다르면 두 개의 포커스가 생기는 것입니다.
  2. 시스템 포커스는 그대로 두고 접근성 포커스를 이동하여 클릭이 가능한, 즉 시스템 포커스에서도 포커스가 가능한 요소에 포커스 했다 하더라도 시스템 포커스와 동기화되지 않습니다.
    예를 들어 1부터 10까지의 숫자 텍스트가 있고 키보드 상호 작용이 가능한 확인, 취소 버튼이 있다고 가정해 봅시다. 탭 키를 누르면 시스템 포커스가 확인, 취소 사이에서만 포커스가 이동할 것입니다. 그런데 시스템 포커스는 확인에 두고 TalkBack 접근성 포커스 이동키를 이용하여 취소 버튼에 포커스 했더라도 시스템 포커스는 확인에 머물러 있습니다.
  3. 반대로 시스템 포커스와 접근성 포커스가 분리된 상태에서 탭 키를 눌러 시스템 포커스를 이동하면 이때는 접근성 포커스도 따라오게 됩니다.
  4. PC와 달리 특정 요소에 포커스를 보내는 접근성 이벤트를 구현할 경우 널리 포럼의 팁 게시판에서 자주 언급했듯이 sendAccessibilityEvent 메소드를 사용하게 되는데 이러한 접근성 이벤트는 접근성 포커스만 이동시킵니다. 따라서 키보드 포커스 이동은 별도 구현을 해 주어야 합니다.

접근성 포커스로 키보드 내비게이션 및 실행을 위한 접근성 고려사항

널리 포럼 팁에서 언급한 바와 같이 PC 웹에서도 가상 커서를 켠 상태에서 링크나 버튼 등에서 엔터를 누르는 것과 가상 커서를 끄고 일반 시스템 포커스로 링크나 버튼 등에서 엔터를 누르는 것은 결과는 같아 보이지만 실제 브라우저에 보내지는 이벤트는 다를 수 있으며 각 스크린리더의 가상 커서 메커니즘 및 개발 의도에 따라 다릅니다.

마찬가지로 TalkBack에서 접근성 포커스를 특정 요소로 보내고 이를 실행할 때와 시스템 포커스를 특정 요소로 보내어 이를 실행할 때 시스템에 보내지는 이벤트 역시 다릅니다. 접근성 포커스를 특정 요소에 두고 실행할 때는 무조건 클릭 이벤트가 발생되며 시스템 포커스를 특정 요소에 보내고 엔터를 눌러 실행할 때는 키코드 이벤트가 실행됩니다.

다만 버튼이나 클릭 가능한 요소를 구현하면 안드로이드 API에서 키코드 이벤트를 자동으로 만들어 주기 때문에 이 두 차이를 대부분 우리는 잘 인식하지 못합니다.

이쯤 설명하면 키보드에서 접근성 포커스로 실행 가능한 모든 요소를 다 이용할 수 있도록 하려면 온클릭이 아닌 onTouchListener를 사용해서는 안 된다는 느낌이 올 것입니다. onTouchListener는 말 그대로 터치를 이용하여 손가락으로 터치했을 때와 뗐을 때 등을 구분하여 이벤트를 구현할 때 사용하게 되는데 대부분 실행 가능한 요소는 클릭 이벤트를 사용하지만 가끔 onTouchListener가 사용된 경우를 발견하는 경우가 있습니다.

이러한 요소들은 키보드로는 상호작용이 불가합니다. 키보드 사용이 가능하도록 하기 위해 키코드 이벤트를 별도 적용한다 하더라도 시스템 포커스가 아닌 접근성 포커스로 해당 요소를 실행하려고 하면 클릭 이벤트가 발생하기 때문에 키코드 이벤트를 적용한다 하더라도 접근성 포커스로는 해당 요소를 실행할 수 없게 됩니다.

따라서 단순히 무언가를 실행하는 작업은 온클릭을 사용하고 onTouchListener 사용을 통한 밀기 작업, 길게 눌러 음성 녹음하는 작업 등을 구현 시에는 키보드로도 해당 작업을 실행할 수 있도록 고려가 필요합니다. 접근성 서비스를 실행 중에는 onTouchListener가 아닌 클릭 이벤트로 동작하도록 하고 음성녹음과 같은 UI는 한번 클릭하면 녹음, 다시 클릭하면 정지 및 전송으로 구현하는 것도 하나의 방법입니다.

지금까지 안드로이드에서 지원하는 키보드 접근성에 대한 특징과 접근성 초점으로 키보드 상호 작용 시 개발 관점에서 유의해야 할 사항들에 대해 살펴보았습니다. 다음에는 시스템 포커스 컨트롤에 대해 다루겠습니다.

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