Niestandardowe ułatwienia dostępu na Androidzie TV

Wiele aplikacji na Androida TV jest tworzonych przy użyciu natywnych komponentów Androida, ale warto też wziąć pod uwagę dostępność platform lub komponentów innych firm, zwłaszcza w przypadku korzystania z niestandardowych widoków.

Niestandardowe komponenty widoków, które bezpośrednio współpracują z OpenGL lub Canvas, mogą nie działać prawidłowo z usługami ułatwień dostępu, takimi jak TalkBack i funkcja Switch Access.

Oto niektóre problemy, które mogą wystąpić, gdy Talkback jest włączony:

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

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

W dalszej części tego przewodnika znajdziesz rozwiązania i sprawdzone metody, które pomogą Ci rozwiązać te problemy.

Zdarzenia z pada kierunkowego są wykorzystywane przez usługi ułatwień dostępu

Przyczyną tego problemu jest to, że zdarzenia klawiszy są wykorzystywane przez usługi ułatwień dostępu.

Obsługa zdarzeń pada kierunkowego i TalkBack
Rysunek 1. Diagramy przedstawiające działanie systemu z włączoną i wyłączoną funkcją Talkback.

Jak pokazano na rysunku 1, gdy Talkback jest włączony, zdarzenia z pada kierunkowego nie są przekazywane do obsługi pada kierunkowego zdefiniowanej przez dewelopera. Zamiast tego usługi ułatwień dostępu otrzymują zdarzenia klawiszy, dzięki czemu mogą przenosić fokus ułatwień dostępu. Ponieważ niestandardowe komponenty Androida domyślnie nie udostępniają usługom ułatwień dostępu informacji o swoim położeniu na ekranie, usługi ułatwień dostępu nie mogą przenieść fokusu ułatwień dostępu, aby je wyróżnić.

Podobnie działają inne usługi ułatwień dostępu: zdarzenia z pada kierunkowego mogą być też skonsumowane podczas korzystania z funkcji Switch Access.

Ponieważ zdarzenia z pada kierunkowego są przesyłane do usług ułatwień dostępu, a usługa ta nie wie, gdzie znajdują się komponenty interfejsu w niestandardowym widoku, musisz zaimplementować AccessibilityNodeInfo, aby aplikacja prawidłowo przekazywała zdarzenia klawiszy.

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

Aby udostępnić usługom ułatwień dostępu wystarczające informacje o lokalizacji i opisie niestandardowych widoków, zaimplementuj AccessibilityNodeInfo aby udostępnić szczegóły każdego komponentu. Aby zdefiniować logiczne relacje między widokami tak aby usługi ułatwień dostępu mogły zarządzać fokusem, zaimplementuj ExploreByTouchHelper i ustaw go za pomocą ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) dla niestandardowych widoków.

Podczas implementowania ExploreByTouchHelper zastąp jego 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)

Więcej informacji znajdziesz w nagraniu z Google I/O 2013 – Enabling Blind and Low-Vision Accessibility on Android (Włączanie ułatwień dostępu dla osób niewidomych i niedowidzących na Androidzie) lub w artykule o populating accessibility events.

Sprawdzone metody

Przykład

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