TV 컨트롤러 관리

TV 기기는 기본 리모컨이나 게임 컨트롤러 형태로 앱과 상호작용하는 보조 하드웨어 기기가 필요합니다. 따라서 앱은 방향 패드 (D패드) 입력을 지원해야 합니다. 또한, 앱이 컨트롤러의 오프라인 전환과 두 종류 이상의 컨트롤러를 통한 입력을 처리할 수 있어야 합니다.

이 가이드에서는 TV 기기용 컨트롤러를 처리하기 위한 요구사항을 설명합니다.

D패드 최소 컨트롤

TV 기기용 기본 컨트롤러는 D패드입니다. 일반적으로 앱은 위, 아래, 왼쪽, 오른쪽, 선택, 뒤로, 홈 버튼만 있는 리모컨으로 작동할 수 있어야 합니다. 앱이 추가 컨트롤이 포함된 게임 컨트롤러를 필요로 하는 경우가 많은 게임이면 이러한 D패드 컨트롤만 사용하는 게임플레이를 지원하도록 시도해야 합니다. 그렇지 않은 경우 컨트롤러가 필요하다는 경고를 사용자에게 표시하고 D패드 컨트롤러를 사용하여 게임을 정상적으로 종료하도록 합니다.

TV 기기용 D패드 컨트롤러를 사용한 탐색에 관한 자세한 내용은 TV 탐색을 참고하세요.

컨트롤러 연결 해제 처리

TV용 컨트롤러는 블루투스 기기인 경우가 많습니다. 이러한 기기는 전력 절약을 위해 주기적으로 절전 모드로 전환되며 TV 기기와 연결을 해제할 수 있습니다. 즉, 이러한 재연결 이벤트를 처리하도록 구성하지 않으면 앱이 중단되거나 다시 시작될 수 있습니다. 이러한 이벤트 는 다음 중 한 가지 상황에서 발생할 수 있습니다.

  • 몇 분짜리 동영상을 재생하는 동안 D패드 또는 게임 컨트롤러가 절전 모드로 전환되면 TV 기기와 연결을 해제했다가 나중에 다시 연결할 수 있습니다.
  • 게임플레이 중에 새로운 플레이어가 아직 연결되지 않은 게임 컨트롤러로 게임에 참여할 수 있습니다.
  • 게임플레이 중에 플레이어가 게임을 종료하고 게임 컨트롤러의 연결을 해제할 수 있습니다.

연결 해제 및 재연결 이벤트가 적용되는 모든 TV 앱 활동은 앱 매니페스트에서 재연결 이벤트를 처리하도록 구성되어야 합니다. 다음 코드 샘플은 키보드 또는 탐색 기기 연결, 연결 해제, 재연결을 비롯한 구성 변경을 처리하는 활동을 사용하는 방법을 보여줍니다.

<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>

이렇게 구성을 변경하면 Android 프레임워크를 통해 앱이 다시 시작되는 좋지 않은 사용자 환경을 제공하는 것이 아니라, 재연결 이벤트를 통해 앱이 계속 실행되도록 할 수 있습니다.

다양한 D패드 입력 처리

TV 기기 사용자는 TV에서 사용하는 컨트롤러를 두 가지 이상 보유할 수 있습니다. 예를 들어 사용자에게 기본 D패드 컨트롤러와 게임 컨트롤러가 둘 다 있을 수 있습니다. 게임 컨트롤러가 D패드 기능으로 사용될 때 제공하는 키 코드 는 기본 D패드가 전송하는 키 코드와 다를 수 있습니다.

사용자가 컨트롤러를 전환하여 앱을 작동시킬 필요가 없도록 다양한 D패드 입력을 처리합니다. 다양한 입력 처리에 관한 자세한 내용은 방향 패드 입력 처리를 참고하세요.

버튼 이벤트 처리

사용자가 컨트롤러의 버튼을 클릭하면 앱은 KeyEvent가 포함된 이벤트를 수신합니다. 의도한 버튼 동작은 미디어 이벤트(예: 재생, 일시중지 또는 중지)일 수도 있고 TV 유형 이벤트(예: 선택 또는 탐색)일 수도 있습니다. 만족스러운 사용자 환경을 제공하려면 컨트롤러 버튼에 일관된 동작을 할당하세요.

TV UI 이벤트

다음 표와 같이 KeyEvent 유형을 생성하는 버튼에 TV UI 동작을 할당합니다.

KeyEvent행동
KEYCODE_BUTTON_B, KEYCODE_BACK뒤로
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER선택
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT탐색

미디어 이벤트

사용자가 미디어를 시청할 때 다음 표와 같이 KeyEvent 유형을 생성하는 버튼에 동작을 할당합니다. 앱이 MediaSession을 제어하는 경우 MediaControllerAdapter 을 사용하여 표에 표시된 MediaControllerCompat.TransportControls 메서드 중 하나를 호출합니다. 이 컨텍스트에서 선택 버튼은 재생 또는 일시중지 버튼으로 작동합니다.

KeyEventTransportControls 호출행동
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER play()Google Play
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER pause()일시중지
BUTTON_R1skipToNext()다음으로 건너뛰기
BUTTON_L1skipToPrevious()이전으로 건너뛰기
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLEfastForward()빨리 감기
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKErewind()되감기
해당 사항 없음stop()중지

참고: MediaSession을 사용하는 경우 KEYCODE_MEDIA_PLAY 또는 KEYCODE_MEDIA_PAUSE과 같은 미디어 관련 버튼의 처리를 재정의하지 마세요. 시스템은 적절한 MediaSession.Callback 메서드를 자동으로 트리거합니다.

적절한 뒤로 버튼 동작 제공

뒤로 버튼을 전환을 위해 사용해서는 안 됩니다. 예를 들어 메뉴를 열고 닫는 데 모두 사용하지 마세요. 탐색경로에서 플레이어가 있었던 이전 화면을 뒤로만 탐색하는 데 사용하세요.

뒤로 버튼은 선형 뒤로 탐색만 실행하므로 다른 버튼으로 열린 인앱 메뉴를 종료하고 앱으로 돌아가는 데 사용할 수 있습니다. 뒤로 버튼을 연속으로 누르면 항상 Android TV 홈 화면으로 이동해야 합니다. 예: 게임플레이 > 게임 일시중지 화면 > 게임 기본 화면 > Android TV 홈 화면 또는 TV 프로그램 재생 > TV 앱 기본 화면 > Android TV 홈 화면

탐색 디자인에 관한 자세한 내용은 뒤로 및 위로 탐색 기능 디자인을 참고하세요. 구현에 관해 알아보려면 적절한 뒤로 탐색 제공을 참고하세요.

게임 컨트롤러 처리

D패드 컨트롤 지원

이 컨트롤 세트는 Android TV 기기의 기본값이므로 D패드 컨트롤을 중심으로 컨트롤 스키마를 계획합니다. 플레이어는 핵심 게임플레이 제어뿐만 아니라 메뉴 및 광고 탐색에 이르기까지 게임의 모든 측면에서 D패드를 사용할 수 있어야 합니다. 따라서 Android TV 게임이 "하여 계속"과 같은 언어로 터치 인터페이스를 참조하지 않도록 하세요.

플레이어의 컨트롤러 상호작용을 형성하는 방법은 만족스러운 사용자 환경을 구현하는 데 중요할 수 있습니다. 다음 권장사항을 고려해 보세요.

  • 컨트롤러 요구사항을 미리 알립니다. Google Play 설명을 사용하여 컨트롤러에 어떤 기능이 있어야 하는지를 플레이어에게 알려주세요. D패드만 있는 게임패드가 아니라 조이스틱이 있는 게임패드에 더 적합한 게임인 경우 이와 같은 사실을 명확히 전달하세요. 게임에 적합하지 않은 컨트롤러를 사용하는 플레이어는 만족스럽지 않은 경험을 할 수 있으며 게임에 낮은 평점을 부여할 수 있습니다.
  • 일관된 버튼 매핑 사용: 직관적인 버튼 매핑은 만족스러운 사용자 환경을 실현하는 데 핵심적입니다. 예를 들어 A 버튼 을 사용하여 수락하고 B 버튼을 사용하여 취소하는 등 허용된 관례를 준수합니다. 재매핑 기능의 형태로 유연성 을 제공할 수도 있습니다. 버튼 매핑에 관한 자세한 내용은 Handle controller actions를 참고하세요.
  • 컨트롤러 기능을 감지하여 적절하게 조정합니다. 컨트롤러와 게임 사이의 일치성을 최적화하려면 컨트롤러에 해당 기능에 관해 쿼리하세요. 예를 들어, 플레이어가 공중에서 컨트롤러를 흔들어 객체를 조종하도록 하려고 하지만, 플레이어 컨트롤러에 가속도계 및 자이로스코프 하드웨어가 없으면 흔들어도 소용이 없습니다. 컨트롤러에 쿼리하여 움직임 감지가 지원되지 않으면 사용 가능한 다른 컨트롤 스키마로 전환합니다. 컨트롤러 기능 쿼리에 관한 자세한 내용은 다양한 버전의 Android에서 컨트롤러 지원을 참고하세요.

적절한 버튼 사용

일부 게임 컨트롤러는 시작, 검색 또는 메뉴 버튼을 제공하지 않습니다. UI가 이러한 버튼의 사용에 의존하지 않도록 하세요.

여러 컨트롤러 처리

여러 플레이어가 각자 자신의 컨트롤러를 사용하여 함께 게임을 하는 경우 각 플레이어 및 컨트롤러 쌍을 매핑하는 것이 중요합니다. 컨트롤러 번호 식별을 구현하는 방법에 관한 자세한 내용은 getControllerNumber()를 참고하세요.

컨트롤러 연결 해제 처리

게임플레이 도중에 컨트롤러가 연결 해제되면 게임을 일시중지하고 연결 해제된 플레이어에게 컨트롤러를 다시 연결하라는 메시지가 표시된 대화상자를 표시합니다.

또한 대화상자에 문제 해결 팁을 제공합니다. 예를 들어 플레이어에게 '블루투스 연결 확인'을 요청합니다. 입력 기기 지원 구현에 관한 자세한 내용은 컨트롤러 작업 처리블루투스 개요를 참고하세요.

컨트롤러 안내 표시

게임에서 시각적 게임 컨트롤 안내를 제공하는 경우 브랜딩이 없는 컨트롤러 이미지를 사용하고 Android와 호환되는 버튼만 포함하세요.

Android 호환 컨트롤러에 관한 샘플 이미지를 보려면 Android TV 게임패드 템플릿 (ZIP)을 다운로드하세요. 검은색 배경의 흰색 컨트롤러와 흰색 배경의 검은색 컨트롤러(그림 1 참조)가 PNG 파일 및 Adobe® Illustrator® 파일로 포함되어 있습니다.

그림 1. Android TV 게임패드 템플릿을 사용한 컨트롤러 안내 예입니다.