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_BACK KEYCODE_BUTTON_B뒤로
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()재생
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()뒤로 이동
N/Astop()중지

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

적절한 뒤로 버튼 동작 제공

뒤로 버튼을 전환 버튼 역할을 해서는 안 됩니다. 예를 들어 메뉴를 열고 닫는 데 사용하지 마세요. 플레이어가 있던 이전 화면을 통해 탐색경로 스타일로 뒤로 이동하는 데만 사용하세요.

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

탐색 디자인에 관한 자세한 내용은 뒤로 및 위로 탐색 디자인을 참고하세요. 구현에 관한 자세한 내용은 적절한 뒤로 탐색 제공을 참고하세요.

게임 컨트롤러 처리

D패드 컨트롤 지원

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

플레이어와 컨트롤러의 상호작용을 구성하는 방식이 우수한 사용자 환경을 달성하는 데 핵심이 될 수 있습니다. 다음 권장사항을 고려하세요.

  • 컨트롤러 요구사항을 미리 전달: Google Play 설명을 사용하여 컨트롤러에 관한 모든 기대치를 플레이어에게 알립니다. 게임이 D패드만 있는 게임패드보다 조이스틱이 있는 게임패드에 더 적합하다면 이를 명확하게 밝혀야 합니다. 게임에 적합하지 않은 컨트롤러를 사용하는 플레이어는 불만족스러운 경험과 게임 평점을 받을 수 있습니다.
  • 일관된 버튼 매핑 사용: 직관적인 버튼 매핑은 우수한 사용자 환경의 핵심입니다. 예를 들어 A 버튼을 사용하여 수락하고 B 버튼을 사용하여 취소하는 방식으로 허용되는 세관 규정을 준수합니다. 재매핑성의 형태로 유연성을 제공할 수도 있습니다. 버튼 매핑에 관한 자세한 내용은 컨트롤러 작업 처리를 참조하세요.
  • 컨트롤러 기능을 감지하고 그에 따라 조정: 컨트롤러에 기능에 관해 쿼리하여 컨트롤러와 게임 간의 일치를 최적화합니다. 예를 들어 플레이어가 공중에서 컨트롤러를 흔들어 객체를 조작하도록 하려고 할 수 있지만 플레이어의 컨트롤러에 가속도계와 자이로스코프 하드웨어가 없으면 흔들림은 작동하지 않습니다. 컨트롤러를 쿼리하고 움직임 감지가 지원되지 않으면 사용 가능한 다른 제어 체계로 전환합니다. 컨트롤러 기능 쿼리에 관한 자세한 내용은 여러 Android 버전에서 컨트롤러 지원을 참조하세요.

적절한 버튼 사용

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

여러 컨트롤러 처리

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

컨트롤러 연결 해제 처리

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

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

컨트롤러 안내 표시

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

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

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