Разработка доступных приложений

Android имеет несколько функций ориентированных на специальные возможности встроенные в платформу, которые позволяют легко оптимизировать ваше приложение для людей с визуальными или физическими недостатками. Тем не менее, это не всегда очевидно, какие оптимизации являются правильными, или какой самый простой способ использовать платформу для этой цели. Этот урок покажет вам как реализовать стратегии и функции платформы, которые предоставляют поддержку специальных возможностей приложений Android.

Добавление описания содержимого

Хорошо продуманный пользовательский интерфейс часто имеет элементы, которые не требуют явной метки для указания их назначения пользователю. Флажок рядом с элементом списка задач в приложении имеет довольно очевидную цель, так же как и мусорное ведро в файловом менеджере. Тем не менее, для пользователей с нарушениями зрения, необходимы другие сигналы интерфейса.

К счастью, можно легко добавить метки к элементам пользовательского интерфейса в вашем приложении, которые можно прочитать вслух вашему пользователю речевой службой, такой как TalkBack . Если у вас есть ярлык, который, вероятно, не меняется в течение всего жизненного цикла приложения (например, «Пауза» или «Купить»), вы можете добавить его в XML макет, установив атрибут android:contentDescription , как в этом примере:

<Button
    android:id=”@+id/pause_button”
    android:src=”@drawable/pause”
    android:contentDescription=”@string/pause”/>

Тем не менее, есть много ситуаций, когда желательно задавать описание контента в некотором контексте, например от состояния кнопки-переключателя или от части выбираемых данных, таких как элемент списка. Для редактирования содержимого описание во время выполнения, используйте метод setContentDescription() , как здесь:

String contentDescription = "Select " + strValues[position];
label.setContentDescription(contentDescription);

Это дополнение к коду является простейшим улучшением доступности, которое вы можете сделать для вашего приложения, но одно из самых полезных. Попробуйте добавить описания контента везде, где есть полезная информация, но избегайте ловушки веб-разработчиков, помечающих все бесполезной информацией. Например, не устанавливайте описание значка приложения как "значок приложения". Это только увеличивает шум, пользователь должен перемещаться, вытаскивая полезную информацию из вашего интерфейса.

Попробуйте! Скачайте TalkBack (сервис специальных возможностей изданный Google) и включите его в Настройки > Специальные возможности > TalkBack. Затем походите по вашему собственному приложению и слушайте звуковые сигналы, предоставляемые TalkBack.

Проектирование фокусировки для навигации

Ваше приложение должно поддерживать разные методы навигации, а не только сенсорный экран. Многие Android устройства поставляются с аппаратными устройствами навигации отличными от сенсорного экрана, такими как D-Pad, клавиши со стрелками, или трекболом. Кроме того, последние релизы Android также поддерживают подключения внешних устройств, таких как клавиатуры через USB или Bluetooth.

Для того чтобы поддержать эту форму навигации, все навигационные элементы, с помощью которых пользователь должен иметь возможность перемещаться, должны быть установлены, как поддерживающие фокус. Эта модификация может быть сделана во время выполнения с помощью метода View.setFocusable() для этого элемента управления пользовательского интерфейса, или установив атрибут android:focusable в файлах XML макета.

Кроме того, каждый элемент управления пользовательского интерфейса имеет 4 атрибута, android:nextFocusUp, android:nextFocusDown, android:nextFocusLeft, и android:nextFocusRight, которые можно использовать для обозначения следующего представления, которое получит фокус, когда пользователь переходит в данном направлении. В то время как платформа определяет навигационные последовательности автоматически на основе близости в макете, вы можете использовать эти атрибуты для переопределения этой последовательности, если она не подходит вашему приложению.

В данном примере, вы представляете кнопку и метку, поддерживающие фокус, так что нажатие вниз приведет вас от кнопки к представлению текста, а нажатие вверх приведет вас обратно к кнопке.

<Button android:id="@+id/doSomething"
    android:focusable="true"
    android:nextFocusDown=”@id/label”
    ... />
<TextView android:id="@+id/label"
    android:focusable=”true”
    android:text="@string/labelText"
    android:nextFocusUp=”@id/doSomething”
    ... />

Убедитесь, что ваше приложение работает интуитивно в этих ситуациях. Самый простой способ это просто запустить приложение в Android эмуляторе, и перемещаться по пользовательскому интерфейсу с помощью клавиш со стрелками эмулятора, используя кнопку OK в качестве замены прикосновения для выбора элемента пользовательского интерфейса.

Запуск событий специальных возможностей

Если вы используете представления компонентов в Android, AccessibilityEvent создается всякий раз, когда вы выбираете элемент или меняется фокус в пользовательском интерфейсе. Эти события просматриваются службой специальных возможностей, позволяя ему обеспечивать функции, такие как преобразование текста в речь для пользователя.

Если вы создаете пользовательское представление, убедитесь, что оно генерирует события в нужное время. Посылайте события вызывая метод sendAccessibilityEvent(int), с параметром, представляющим тип события, которое произошло. Полный список типов событий поддерживаемых в настоящее время можно найти в справочной документации AccessibilityEvent.

В качестве примера, если вы хотите расширить представление изображений таким образом, что бы можно было бы создавать подписи, набрав на клавиатуре, когда нем фокус, то имеет смысл вызвать событие TYPE_VIEW_TEXT_CHANGED , несмотря на то, что это не обычно для просмотра изображений. Код для генерации этого события будет выглядеть следующим образом:

public void onTextChanged(String before, String after) {
    ...
    if (AccessibilityManager.getInstance(mContext).isEnabled()) {
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
    }
    ...
}

Тестирование вашего приложения

Обязательно проверьте функциональность специальных возможностей, после того как вы добавили её в ваше приложение. Для того чтобы проверить описания содержимого и события, установите и включите службу специальных возможностей. Один из вариантов это Talkback , бесплатный, с открытым исходным кодом считыватель экрана доступный на Google Play. С включенным сервисом, протестируйте всю навигацию приложения и слушайте разговорную обратную связь.

Кроме того, попытайтесь перемещаться по приложению с помощью контроллера управления направлением, вместо сенсорного экрана. Вы можете использовать физическое устройство с d-pad или трекболом, если оно доступно. Если нет, используйте Android эмулятор и его моделируемое управление с клавиатуры.

Между службами обеспечения обратной связи и направленной навигации по вашему приложению, вы должны получить представление о том, на что похоже ваше приложение при навигации без каких-либо визуальных ориентиров. Исправьте проблемные области, как они появляются, и вы будете в конечном итоге с более доступным Android приложением.