Hỗ trợ khả năng hỗ trợ tiếp cận cho chế độ xem tuỳ chỉnh trên Android TV

Tuy nhiều ứng dụng Android TV được xây dựng bằng các thành phần Android gốc, nhưng bạn cũng nên xem xét khả năng hỗ trợ tiếp cận của các khung hoặc thành phần của bên thứ ba, đặc biệt là khi sử dụng thành phần hiển thị tuỳ chỉnh.

Các thành phần khung hiển thị tuỳ chỉnh giao tiếp trực tiếp với OpenGL hoặc Canvas có thể không hoạt động hiệu quả với các dịch vụ hỗ trợ tiếp cận như TalkBack và Tiếp cận bằng công tắc.

Hãy cân nhắc một số vấn đề sau đây có thể xảy ra khi TalkBack đang bật:

  • Tiêu điểm hỗ trợ tiếp cận (một hình chữ nhật màu xanh lục) có thể biến mất trong ứng dụng của bạn.
  • Tiêu điểm hỗ trợ tiếp cận có thể chọn ranh giới của toàn bộ màn hình.
  • Tiêu điểm hỗ trợ tiếp cận có thể không di chuyển được.
  • Phím bốn hướng trên D-pad có thể không có tác dụng, ngay cả khi mã của bạn đang xử lý các phím đó.

Nếu bạn quan sát thấy bất kỳ vấn đề nào trong số này trên ứng dụng của mình, hãy kiểm tra để đảm bảo rằng ứng dụng hiển thị cây AccessibilityNodeInfo trên các dịch vụ hỗ trợ tiếp cận.

Phần còn lại của hướng dẫn này cung cấp một số giải pháp và phương pháp hay nhất để giải quyết những vấn đề này.

Các dịch vụ hỗ trợ tiếp cận sử dụng các sự kiện D-pad

Nguyên nhân gốc của vấn đề này là do các sự kiện chính được các dịch vụ hỗ trợ tiếp cận sử dụng.

Mức sử dụng sự kiện trên dpad Hình 1. Sơ đồ mô tả cách hoạt động của hệ thống khi TalkBack bật và tắt.

Như minh hoạ trong hình 1, khi TalkBack được bật, các sự kiện D-pad sẽ không được chuyển đến trình xử lý D-pad do nhà phát triển xác định. Thay vào đó, các dịch vụ hỗ trợ tiếp cận sẽ nhận các sự kiện chính để có thể di chuyển tâm điểm hỗ trợ tiếp cận. Vì theo mặc định, các thành phần Android tuỳ chỉnh không hiển thị thông tin về vị trí của các thành phần đó cho các dịch vụ hỗ trợ tiếp cận trên màn hình, nên các dịch vụ hỗ trợ tiếp cận không thể di chuyển tâm điểm hỗ trợ tiếp cận để làm nổi bật các dịch vụ đó.

Các dịch vụ hỗ trợ tiếp cận khác cũng bị ảnh hưởng tương tự: các sự kiện D-pad cũng có thể được sử dụng khi sử dụng tính năng Tiếp cận bằng công tắc.

Vì các sự kiện D-pad được gửi đến các dịch vụ hỗ trợ tiếp cận và dịch vụ đó không biết vị trí của các thành phần giao diện người dùng trong khung hiển thị tuỳ chỉnh, nên bạn phải triển khai AccessibilityNodeInfo để ứng dụng của mình chuyển tiếp các sự kiện chính một cách chính xác.

Đưa thông tin cho các dịch vụ hỗ trợ tiếp cận

Để cung cấp cho các dịch vụ hỗ trợ tiếp cận đầy đủ thông tin về vị trí và nội dung mô tả của thành phần hiển thị tuỳ chỉnh, hãy triển khai AccessibilityNodeInfo để hiển thị thông tin chi tiết cho từng thành phần. Để xác định mối quan hệ logic của các khung hiển thị sao cho các dịch vụ hỗ trợ tiếp cận có thể quản lý tiêu điểm, hãy triển khai ExploreByTouchHelper và đặt đối tượng này bằng ViewCompat.setAccessibilityDelegate(View, AccessibilityDelegateCompat) cho khung hiển thị tuỳ chỉnh.

Khi triển khai ExploreByTouchHelper, hãy ghi đè 4 phương thức trừu tượng:

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)

Để biết thêm thông tin chi tiết, hãy xem Google I/O 2013 – Bật tính năng hỗ trợ tiếp cận cho người khiếm thị và thị lực kém trên Android hoặc đọc thêm về cách điền sẵn sự kiện hỗ trợ tiếp cận.

Các phương pháp hay nhất

Mẫu

Tham khảo mẫu hỗ trợ tiếp cận của khung hiển thị tuỳ chỉnh dành cho Android TV để xem các phương pháp hay nhất để thêm tính năng hỗ trợ tiếp cận cho các ứng dụng dùng khung hiển thị tuỳ chỉnh.