Niestandardowe ułatwienia dostępu na Androidzie TV

Chociaż wiele aplikacji na Androida TV opiera się na natywnych komponentach Androida, należy też wziąć pod uwagę ułatwienia dostępu w przypadku platform i komponentów innych firm, zwłaszcza w przypadku widoków niestandardowych.

Komponenty widoku niestandardowego współpracujące bezpośrednio z OpenGL lub Canvas mogą nie działać dobrze z usługami ułatwień dostępu takimi jak TalkBack i Switch Access.

Weź pod uwagę te problemy, które mogą wystąpić po włączeniu TalkBack:

  • Wyróżnienie ułatwień dostępu (zielony prostokąt) może zniknąć z aplikacji.
  • Fokus może wybrać granicę całego ekranu.
  • Możliwe, że nie można przenieść fokusu.
  • Cztery klawisze kierunkowe na padzie kierunkowym mogą nie działać, nawet jeśli obsługuje je Twój kod.

Jeśli zauważysz w aplikacji którykolwiek z tych problemów, sprawdź, czy udostępnia ona swoje drzewo AccessibilityNodeInfo usługom ułatwień dostępu.

W dalszej części tego przewodnika znajdziesz kilka rozwiązań i sprawdzonych metod, które pomogą Ci rozwiązać te problemy.

Zdarzenia na padzie kierunkowym są używane przez usługi ułatwień dostępu

Główna przyczyna tego problemu jest taka, że kluczowe zdarzenia są wykorzystywane przez usługi ułatwień dostępu.

Wykorzystanie zdarzeń Dpad Rysunek 1. Diagramy przedstawiające, jak działa system z włączoną i wyłączoną funkcją TalkBack.

Jak pokazano na ilustracji 1, po włączeniu TalkBack zdarzenia z pada kierunkowego nie są przekazywane do modułu obsługi pada skonfigurowanego przez programistę. Zamiast tego usługi ułatwień dostępu otrzymują ważne zdarzenia, dzięki którym mogą przenosić koncentrację na ułatwieniach dostępu. Ponieważ niestandardowe komponenty Androida domyślnie nie ujawniają usługom ułatwień dostępu informacji o ich pozycji na ekranie, nie mogą one przenieść fokusu, aby je wyróżnić.

Ten problem ma podobny wpływ na inne usługi ułatwień dostępu: podczas korzystania z funkcji Switch Access mogą być też rejestrowane zdarzenia dotyczące pada kierunkowego.

Zdarzenia na padzie kierunkowym są przesyłane do usług ułatwień dostępu, a usługa ta nie wie, gdzie znajdują się komponenty UI w widoku niestandardowym, dlatego musisz wdrożyć w aplikacji AccessibilityNodeInfo, aby prawidłowo przekazywać kluczowe zdarzenia.

Udostępnianie informacji usługom ułatwień dostępu

Aby zapewnić usługom ułatwień dostępu wystarczającą ilość informacji o lokalizacji i opisie widoków niestandardowych, zaimplementuj AccessibilityNodeInfo w celu wyeksponowania szczegółów każdego komponentu. Aby zdefiniować logiczną relację między widokami, tak aby usługi ułatwień dostępu mogły zarządzać koncentracją, zaimplementuj ExploreByTouchHelper i ustaw go za pomocą ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) na potrzeby widoków niestandardowych.

Podczas implementowania metody ExploreByTouchHelper zastąp jej 4 metody abstrakcyjne:

Kotlin

// Return the virtual view ID whose view is covered by the input point (x, y).
protected fun getVirtualViewAt(x: Float, y: Float): Int

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected fun getVisibleVirtualViews(virtualViewIds: List<Int>)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected fun onPopulateNodeForVirtualView(virtualViewId: Int, @NonNull node: AccessibilityNodeInfoCompat)

// Set the accessibility handling when perform action.
protected fun onPerformActionForVirtualView(virtualViewId: Int, action: Int, @Nullable arguments: Bundle): Boolean

Java

// Return the virtual view ID whose view is covered by the input point (x, y).
protected int getVirtualViewAt(float x, float y)

// Fill the virtual view ID list into the input parameter virtualViewIds.
protected void getVisibleVirtualViews(List<Integer> virtualViewIds)

// For the view whose virtualViewId is the input virtualViewId, populate the
// accessibility node information into the AccessibilityNodeInfoCompat parameter.
protected void onPopulateNodeForVirtualView(int virtualViewId, @NonNull AccessibilityNodeInfoCompat node)

// Set the accessibility handling when perform action.
protected boolean onPerformActionForVirtualView(int virtualViewId, int action, @Nullable Bundle arguments)

Aby dowiedzieć się więcej, obejrzyj Google I/O 2013 – Włączanie ułatwień dostępu dla osób niewidomych i niedowidzących na Androidzie lub dowiedz się więcej o wypełnianiu zdarzeń ułatwień dostępu.

Sprawdzone metody

Próbka

Zapoznaj się z przykładem ułatwień dostępu w widoku niestandardowym na Androidzie TV, aby poznać sprawdzone metody dodawania obsługi ułatwień dostępu do aplikacji korzystających z widoków niestandardowych.