Quản lý bộ điều khiển TV

Thiết bị TV cần có một thiết bị phần cứng phụ để tương tác với các ứng dụng, chẳng hạn như bộ điều khiển từ xa cơ bản, điều khiển từ xa dạng con trỏ hoặc tay điều khiển trò chơi. Để mang lại trải nghiệm nhất quán cho người dùng, ứng dụng của bạn phải hỗ trợ phương thức nhập bằng bàn phím di chuyển (D-pad), xử lý các tay điều khiển chuyển sang trạng thái ngoại tuyến và hỗ trợ phương thức nhập từ nhiều loại tay điều khiển, bao gồm cả điều khiển từ xa dạng con trỏ.

Các nút điều khiển tối thiểu trên D-pad

Bộ điều khiển mặc định cho thiết bị TV là một D-pad. Nhìn chung, ứng dụng của bạn phải hoạt động được bằng một điều khiển từ xa chỉ có các nút lên, xuống, trái, phải, chọn, Quay lại và nút màn hình chính. Nếu ứng dụng của bạn là một trò chơi thường yêu cầu tay điều khiển trò chơi có thêm các nút điều khiển, hãy cố gắng hỗ trợ lối chơi chỉ bằng các nút điều khiển D-pad này. Nếu không, hãy cảnh báo người dùng rằng họ cần có tay điều khiển và cho phép họ thoát khỏi trò chơi một cách dễ dàng bằng tay điều khiển D-pad.

Để biết thêm thông tin về cách điều hướng bằng bộ điều khiển D-pad cho thiết bị TV, hãy xem phần Điều hướng trên TV.

Xử lý việc ngắt kết nối bộ điều khiển

Bộ điều khiển cho TV thường là thiết bị Bluetooth, có thể tìm cách tiết kiệm điện bằng cách định kỳ chuyển sang chế độ ngủ và ngắt kết nối khỏi thiết bị TV. Điều này có nghĩa là một ứng dụng có thể bị gián đoạn hoặc khởi động lại nếu không được định cấu hình để xử lý các sự kiện kết nối lại này. Những sự kiện này có thể xảy ra trong bất kỳ trường hợp nào sau đây:

  • Trong khi phát một video dài vài phút, d-pad hoặc tay điều khiển trò chơi có thể chuyển sang chế độ ngủ, ngắt kết nối khỏi thiết bị TV và kết nối lại sau.
  • Trong khi chơi, một người chơi mới có thể tham gia trò chơi bằng tay điều khiển trò chơi chưa được kết nối.
  • Trong khi chơi, người chơi có thể rời khỏi trò chơi và ngắt kết nối tay điều khiển trò chơi.

Mọi hoạt động của ứng dụng truyền hình chịu sự kiện ngắt kết nối và kết nối lại đều phải được định cấu hình để xử lý sự kiện kết nối lại trong tệp kê khai ứng dụng. Mã mẫu sau đây minh hoạ cách cho phép một hoạt động xử lý các thay đổi về cấu hình, bao gồm cả việc kết nối, ngắt kết nối hoặc kết nối lại bàn phím hoặc thiết bị điều hướng:

<activity
  android:name="com.example.android.TvActivity"
  android:label="@string/app_name"
  android:configChanges="keyboard|keyboardHidden|navigation"
  android:theme="@style/Theme.Leanback">

  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
  </intent-filter>
  ...
</activity>

Thay đổi về cấu hình này cho phép ứng dụng tiếp tục chạy thông qua một sự kiện kết nối lại, thay vì được khởi động lại bằng khung Android, điều này không mang lại trải nghiệm tốt cho người dùng.

Xử lý các biến thể đầu vào của D-pad

Người dùng thiết bị TV có thể có nhiều loại bộ điều khiển mà họ sử dụng với TV. Ví dụ: người dùng có thể có một tay điều khiển D-pad cơ bản, một điều khiển từ xa có con trỏ hoặc một tay điều khiển trò chơi. Mã phím do tay điều khiển trò chơi cung cấp khi được dùng cho các chức năng của D-pad có thể khác với mã phím do D-pad cơ bản gửi.

Xử lý các biến thể trong phương thức nhập bằng D-pad để người dùng không phải chuyển đổi bộ điều khiển nhằm vận hành ứng dụng của bạn. Để biết thêm thông tin về cách xử lý các biến thể đầu vào, hãy xem bài viết Xử lý phương thức nhập bằng bàn phím định hướng.

Hỗ trợ điều khiển từ xa có con trỏ

Một số thiết bị TV hỗ trợ điều khiển từ xa bằng con trỏ, chẳng hạn như chuột bay hoặc điều khiển từ xa có bàn di chuột cảm ứng. Việc hỗ trợ điều khiển từ xa bằng con trỏ cho phép người dùng tương tác với ứng dụng của bạn bằng các cử chỉ trỏ và nhấp, di chuột, vuốt và kéo, mang lại trải nghiệm mượt mà hơn trên phần cứng tương thích trong khi vẫn duy trì khả năng tương thích hoàn toàn với D-pad.

Khai báo tính năng hỗ trợ điều khiển từ xa bằng con trỏ trong tệp kê khai

Để cho biết rằng ứng dụng của bạn có thể điều hướng bằng con trỏ và nhập bằng cách chạm, hãy định cấu hình tệp kê khai ứng dụng bằng android.software.leanback.supports_touch <property> được đặt thành true bên trong phần tử <application> (hoặc bên trong các phần tử <activity> riêng lẻ để định cấu hình hỗ trợ cho mỗi hoạt động):

<manifest ...>
    <!-- Signal whether the app is adaptive or built just for TV -->
    <uses-feature
        android:name="android.software.leanback"
        android:required="true|false" />
    <!-- Ensure the app can be installed on conventional TVs -->
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />
    <application ...>
        <!-- Signal whether the app supports pointer remotes -->
        <property
            android:name="android.software.leanback.supports_touch"
            android:value="true" />
        ...
    </application>
</manifest>

Hỗ trợ các hoạt động tương tác nhấp, di chuột và cuộn

Khi hỗ trợ điều khiển từ xa bằng con trỏ, hãy đảm bảo các thành phần giao diện người dùng phản hồi phù hợp với con trỏ và thao tác chạm trong các hoạt động tương tác sau:

  • Nhấp và chọn: tất cả các phần tử trên giao diện người dùng có thể lấy tiêu điểm và có thể chọn đều phải nhấp được bằng điều khiển từ xa dạng con trỏ, phù hợp với hành vi của lựa chọn D-pad (KEYCODE_DPAD_CENTER).
    • Jetpack Compose: sử dụng đối tượng sửa đổi Modifier.clickable() hoặc pointerInput. Để biết thêm thông tin, hãy xem phần Nhấn và nhấn giữ.
    • Khung hiển thị: xử lý các sự kiện nhấp chuột trên khung hiển thị. Để biết thêm thông tin, hãy xem bài viết Tổng quan về sự kiện đầu vào.
  • Trạng thái di chuột trực quan: cung cấp hiệu ứng di chuột trực quan rõ ràng để cho biết khi con trỏ được đặt trên một mục có thể chọn.
  • Thao tác vuốt và hất để cuộn: thao tác cuộn ngang và dọc được kích hoạt bằng cử chỉ vuốt hoặc hất trên nút giữa D-pad cảm ứng phải hoạt động mượt mà trên tất cả nội dung có thể cuộn.
  • Kéo để cuộn: người dùng phải có thể kéo để cuộn theo chiều dọc (lên và xuống) hoặc theo chiều ngang (trái và phải) trên các vùng chứa có thể cuộn.
    • Jetpack Compose: Theo mặc định, các vùng chứa có thể cuộn tiêu chuẩn hỗ trợ thao tác cuộn bằng con trỏ và thao tác chạm. Để biết cách triển khai tuỳ chỉnh, hãy xem bài viết Phương thức nhập bằng con trỏ trong Compose.
    • Khung hiển thị: khung hiển thị có thể cuộn chuẩn hỗ trợ thao tác cuộn bằng cách chạm theo mặc định. Để biết cách xử lý hoạt động đầu vào tuỳ chỉnh, hãy xem phần Thao tác chạm và nhập.
  • Tua nội dung nghe nhìn: trong khi phát nội dung nghe nhìn (chẳng hạn như chương trình truyền hình và phim), người dùng phải có thể tương tác với thanh tiến trình phát (thanh tua) bằng cách trỏ và nhấp để chuyển đến một dấu thời gian trong quá khứ hoặc tương lai, cũng như kéo (tua) dọc theo thanh tiến trình để tua đến một thời điểm cụ thể.

Xử lý sự kiện nút

Khi người dùng nhấp vào một nút trên tay điều khiển, ứng dụng của bạn sẽ nhận được một sự kiện có KeyEvent. Hành vi dự kiến cho nút có thể là một sự kiện đa phương tiện, chẳng hạn như phát, tạm dừng hoặc dừng, hoặc có thể là một sự kiện thuộc loại TV, chẳng hạn như lựa chọn hoặc điều hướng. Để mang lại trải nghiệm tốt cho người dùng, hãy chỉ định hành vi nhất quán cho các nút trên tay điều khiển.

Sự kiện giao diện người dùng trên TV

Chỉ định hành vi của giao diện người dùng TV cho các nút tạo ra các loại KeyEvent như trong bảng sau:

KeyEvent Hành vi
KEYCODE_BUTTON_B, KEYCODE_BACK Quay lại
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER Lựa chọn
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT Điều hướng

Sự kiện nội dung nghe nhìn

Khi người dùng đang xem nội dung nghe nhìn, hãy chỉ định hành vi cho các nút tạo ra các loại KeyEvent như trong bảng sau. Nếu ứng dụng của bạn đang kiểm soát một MediaSession, hãy sử dụng MediaControllerAdapter để gọi một trong các phương thức MediaControllerCompat.TransportControls trong bảng. Lưu ý rằng các nút lựa chọn đóng vai trò là nút Phát hoặc Tạm dừng trong bối cảnh này.

KeyEvent Cuộc gọi TransportControls Hành vi
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER play() Phát
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause() Tạm dừng
BUTTON_R1 skipToNext() Chuyển tới mục tiếp theo
BUTTON_L1 skipToPrevious() Chuyển về mục trước
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE fastForward() Tua đi
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE rewind() Tua lại
Không áp dụng stop() Dừng

Cung cấp hành vi phù hợp cho nút Quay lại

Nút Quay lại không được hoạt động như một nút bật/tắt. Ví dụ: đừng dùng nút này để vừa mở vừa đóng trình đơn. Chỉ sử dụng nút này để quay lại, theo kiểu đường dẫn, qua các màn hình trước đó mà người chơi đã truy cập.

Vì nút Quay lại chỉ thực hiện thao tác điều hướng lùi tuyến tính, nên bạn có thể sử dụng nút này để thoát khỏi trình đơn trong ứng dụng được mở bằng một nút khác và quay lại ứng dụng. Thao tác nhấn liên tiếp nút Quay lại luôn phải đưa người dùng đến màn hình chính của Android TV. Ví dụ: chơi trò chơi > màn hình tạm dừng trò chơi > màn hình chính của trò chơi > màn hình chính của Android TV hoặc phát chương trình truyền hình > màn hình chính của ứng dụng truyền hình

Màn hình chính của Android TV.

Để biết thêm thông tin về thiết kế cho thành phần điều hướng, hãy xem phần Thiết kế thành phần điều hướng Quay lại và Lên. Để tìm hiểu về cách triển khai, hãy tham khảo bài viết Cung cấp tính năng điều hướng quay lại phù hợp.

Xử lý tay điều khiển cho trò chơi

Khi xây dựng trò chơi cho Android TV, hãy thiết kế sơ đồ điều khiển để hoạt động với cả điều khiển TV tiêu chuẩn và tay điều khiển trò chơi chuyên dụng.

Hỗ trợ các nút điều khiển D-pad

Lập kế hoạch cho sơ đồ điều khiển xung quanh một nút điều khiển D-pad, vì bộ điều khiển này là mặc định cho các thiết bị Android TV. Người chơi cần có thể sử dụng D-pad cho mọi khía cạnh của trò chơi, không chỉ điều khiển lối chơi cốt lõi mà còn điều hướng trình đơn và quảng cáo. Vì lý do này, hãy đảm bảo rằng trò chơi Android TV của bạn không đề cập đến giao diện cảm ứng bằng ngôn ngữ như "Nhấn vào đây để tiếp tục".

Cách bạn định hình hoạt động tương tác của người chơi với tay điều khiển có thể là yếu tố then chốt để đạt được trải nghiệm người dùng tuyệt vời. Hãy cân nhắc các phương pháp hay nhất sau đây:

  • Thông báo trước về các yêu cầu đối với tay điều khiển: sử dụng phần mô tả trên Google Play để thông báo cho người chơi về mọi yêu cầu đối với tay điều khiển. Nếu trò chơi phù hợp hơn với tay điều khiển trò chơi có cần điều khiển hơn là tay điều khiển trò chơi chỉ có d-pad, hãy nêu rõ điều này. Người chơi sử dụng tay điều khiển không phù hợp cho trò chơi có thể có trải nghiệm kém và xếp hạng thấp cho trò chơi của bạn.
  • Sử dụng tính năng ánh xạ nút nhất quán: tính năng ánh xạ nút trực quan là yếu tố then chốt để mang lại trải nghiệm tốt cho người dùng. Ví dụ: tuân thủ các quy ước được chấp nhận bằng cách sử dụng nút A để chấp nhận và nút B để huỷ. Bạn cũng có thể mang đến sự linh hoạt bằng cách cho phép người dùng gán lại nút. Để biết thêm thông tin về việc liên kết nút, hãy xem phần Xử lý thao tác trên tay điều khiển.
  • Phát hiện các chức năng của tay điều khiển và điều chỉnh cho phù hợp: truy vấn tay điều khiển về các chức năng của tay điều khiển để tối ưu hoá khả năng tương thích giữa tay điều khiển và trò chơi. Ví dụ: bạn có thể muốn người chơi điều khiển một đối tượng bằng cách vẫy tay điều khiển trong không trung, nhưng nếu tay điều khiển của người chơi thiếu phần cứng gia tốc kế và con quay hồi chuyển, thì thao tác vẫy sẽ không hoạt động. Truy vấn bộ điều khiển và nếu không hỗ trợ tính năng phát hiện chuyển động, hãy chuyển sang một lược đồ điều khiển thay thế có sẵn. Để biết thêm thông tin về cách truy vấn các chức năng của tay điều khiển, hãy xem phần Hỗ trợ tay điều khiển trên các phiên bản Android.

Sử dụng các nút thích hợp

Không phải tay điều khiển trò chơi nào cũng có nút Bắt đầu, Tìm kiếm hoặc Trình đơn. Hãy đảm bảo giao diện người dùng của bạn không phụ thuộc vào việc sử dụng các nút này.

Xử lý nhiều bộ điều khiển

Khi nhiều người chơi đang chơi một trò chơi, mỗi người có tay điều khiển riêng, thì bạn cần phải liên kết từng cặp người chơi và tay điều khiển. Để biết thông tin về cách triển khai tính năng nhận dạng số tay điều khiển, hãy xem getControllerNumber().

Xử lý việc ngắt kết nối bộ điều khiển

Khi tay điều khiển bị ngắt kết nối giữa lúc chơi, hãy tạm dừng trò chơi và hiện hộp thoại nhắc người chơi bị ngắt kết nối kết nối lại tay điều khiển.

Ngoài ra, hãy đưa ra các mẹo khắc phục sự cố trong hộp thoại. Ví dụ: yêu cầu người chơi "Kiểm tra kết nối Bluetooth". Để biết thêm thông tin về cách triển khai tính năng hỗ trợ thiết bị đầu vào, hãy xem bài viết Xử lý thao tác của bộ điều khiển và Tổng quan về Bluetooth.

Hiện hướng dẫn về bộ điều khiển

Nếu trò chơi của bạn cung cấp hướng dẫn điều khiển trò chơi bằng hình ảnh, hãy sử dụng hình ảnh tay điều khiển trò chơi không có thương hiệu và chỉ bao gồm các nút tương thích với Android.

Để xem hình ảnh mẫu của tay điều khiển tương thích với Android, hãy tải Mẫu tay điều khiển trò chơi cho Android TV (ZIP) xuống. Tệp này bao gồm một bộ điều khiển màu trắng trên nền đen và một bộ điều khiển màu đen trên nền trắng (như trong hình 1) dưới dạng tệp PNG và tệp Adobe® Illustrator®.

**Hình 1.** Ví dụ về hướng dẫn sử dụng tay điều khiển bằng Mẫu tay điều khiển trò chơi trên Android TV.