Статьи

Инклюзивные интерфейсы Android с пользовательскими сервисами специальных возможностей

Эта статья была рецензирована Адрианом Санду . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

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

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

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

Услуги по доступности

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

В этом уроке я расскажу о создании службы специальных возможностей, которая фильтрует действия, которые выполняют пользователи, и на основе этих действий служба будет использовать TextToSpeech для обратной связи.

Давайте начнем строить, вы можете найти код для проекта на GitHub . Откройте Android Studio и создайте новый проект Blank Activity .

Создайте класс с именем файла CustomAccessibilityService.java, который расширяет AccessibilityService и реализует методы переопределения ( onAccessibilityEvent и onInterrupt ):

 public class CustomAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { } @Override public void onInterrupt() { } } 

Объявите AccessibilityService в файле манифеста

Службы специальных возможностей должны быть явно объявлены в файле манифеста приложения:

 <application> ... <!--Declare AccessibilityService--> <service android:name=".CustomAccessibilityService" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/service_configuration" /> </service> ... </application> 

Объявление указывает имя класса AccessibilityService с разрешением BIND_ACCESSIBILITY_SERVICE которое отличает эту службу от службы доступности. Метаданные содержат файл ресурсов конфигурации службы.

Настройте службу доступности

Конфигурирование службы доступности включает в себя указание типов событий доступности, которые обрабатывает служба.

Создайте service_configuration.xml внутри res / xml / и добавьте следующее:

 <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeViewClicked|typeViewScrolled" android:accessibilityFeedbackType="feedbackAllMask" android:canRetrieveWindowContent="true" android:notificationTimeout="100" android:packageNames="valdioveliu.accessibilityservice" /> 

Наиболее важным параметром здесь является accessibilityEventTypes который представляет потоки событий, на которые подписывается эта служба.

Важным параметром является объявление packageNames . Если вы не укажете имя пакета для службы специальных возможностей, оно будет работать во всей системе. Вы можете объявить более одного packageName для службы доступности.

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

Класс обслуживания Доступности — это то, где происходит вся магия. Добавьте следующее в CustomAccessibilityService.java :

 public class CustomAccessibilityService extends AccessibilityService { private TextToSpeech textToSpeech; //Configure the Accessibility Service @Override protected void onServiceConnected() { Toast.makeText(getApplication(), "onServiceConnected", Toast.LENGTH_SHORT).show(); //Init TextToSpeech textToSpeech = new TextToSpeech(getApplication(), new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { int result = textToSpeech.setLanguage(Locale.US); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TextToSpeech", "Language not supported"); } } else { Log.e("TextToSpeech", "Initialization Failed! 🙁 "); } } }); } //Respond to AccessibilityEvents @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) { Toast.makeText(getApplication(), event.getText().toString(), Toast.LENGTH_SHORT).show(); //TextToSpeech if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { textToSpeech.speak(event.getText().toString(), TextToSpeech.QUEUE_FLUSH, null, "TextToSpeech_ID"); } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { textToSpeech.speak(event.getText().toString(), TextToSpeech.QUEUE_FLUSH, null); } } else if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { //RecyclerView Scrolled //TextToSpeech if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { textToSpeech.speak("Scrolling", TextToSpeech.QUEUE_FLUSH, null, "TextToSpeech_ID"); } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { textToSpeech.speak("Scrolling", TextToSpeech.QUEUE_FLUSH, null); } } } @Override public void onInterrupt() { //Interrupt the Accessibility service //Stop TextToSpeech if (textToSpeech != null) { textToSpeech.stop(); textToSpeech.shutdown(); } } } 

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

Метод onInterrupt вызывается, когда платформа Android хочет остановить работу службы.

onServiceConnected устанавливает TextToSpeech после того, как система успешно TextToSpeech с сервисом.

Этот сервис специальных возможностей работает только для интерактивных видов. Это означает, что он не будет работать, если пользователь попытается щелкнуть по неблокируемому представлению, например, textView. Для использования сервиса в этом случае вам необходимо добавить следующий атрибут в представление.

 <TextView ... android:clickable="true" .../> 

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

Вывод

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