Niestandardowe ułatwienia dostępu na Androidzie TV

Choć wiele aplikacji na Androida TV bazuje na natywnych komponentach Androida, trzeba też wziąć pod uwagę ułatwienia dostępu stronom trzecim, platform i komponentów, zwłaszcza podczas korzystania z widoków niestandardowych.

Komponenty widoku niestandardowego łączące się bezpośrednio z OpenGL lub Canvas mogą nie działać prawidłowo z ułatwieniami dostępu takimi jak TalkBack czy Switch Access.

Weź pod uwagę niektóre z poniższych problemów, które mogą wystąpić po przełączeniu TalkBack dnia:

  • Wyróżnienie ułatwień dostępu (zielony prostokąt) może zniknąć z aplikacji.
  • Ułatwienia dostępu mogą zaznaczać granicę całego ekranu.
  • Przenoszenie fokusu może nie być możliwe.
  • Cztery klawisze kierunkowe na padzie kierunkowym mogą nie działać, nawet jeśli jest on obsługiwany przez Twój kod.

Jeśli zauważysz którykolwiek z tych problemów w aplikacji, sprawdź, czy aplikacja ujawnia AccessibilityNodeInfo w usłudze ułatwień dostępu.

W pozostałej części tego przewodnika znajdziesz wybrane rozwiązania i sprawdzone metody rozwiązywania tych problemów.

Usługi ułatwień dostępu odsłuchują zdarzenia za pomocą pada kierunkowego

Główna przyczyna tego problemu: kluczowe zdarzenia są wykorzystywane przez ułatwienia dostępu usług Google.

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

Jak pokazano na ilustracji 1, po włączeniu TalkBack zdarzenia na padzie kierunkowym nie są przekazywane do modułu obsługi pada kierunkowego zdefiniowanego przez programistę. Zamiast tego: usługi ułatwień dostępu odbierają kluczowe zdarzenia, aby można było przenieść ułatwienia dostępu. Niestandardowe komponenty Androida nie są domyślnie ujawniane informacje dla usług ułatwień dostępu o ich pozycji na ekranie, usługi ułatwień dostępu nie mogą przenieść fokusu, aby je wyróżnić.

Podobny wpływ ma to na inne usługi ułatwień dostępu – mogą być też zdarzenia na padzie kierunkowym używane podczas korzystania z funkcji Switch Access.

Ponieważ zdarzenia za pomocą pada kierunkowego są przesyłane do usług ułatwień dostępu. nie wie, gdzie znajdują się komponenty interfejsu w widoku niestandardowym, musisz zaimplementować w aplikacji AccessibilityNodeInfo, aby przekazywać kluczowe zdarzenia.

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

Aby dostarczyć usługom ułatwień dostępu wystarczające informacje na temat lokalizacja i opis widoków niestandardowych, implementacja AccessibilityNodeInfo aby pokazać szczegóły każdego komponentu. Zdefiniowanie logicznej relacji między widokami, tak aby usługi ułatwień dostępu zarządzaj skupieniem, wdróż ExploreByTouchHelper i ustaw go za pomocą ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) dla widoków niestandardowych.

Gdy implementujesz funkcję ExploreByTouchHelper, zastąp jej 4 abstrakcyjne metody:

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 na konferencji Google I/O 2013 – Wspieranie osób niewidomych i niedowidzących Ułatwienia dostępu na Androidzie lub przeczytaj o wypełnianiu zdarzeń ułatwień dostępu.

Sprawdzone metody

Próbka

Zapoznaj się z przykładem ułatwień dostępu w widoku niestandardowym w Androidzie TV, aby poznać sprawdzone metody dotyczące obsługa ułatwień dostępu w aplikacjach korzystających z widoków niestandardowych.