TV 하드웨어는 다른 Android 기기와 상당히 다릅니다. TV에는 터치스크린, 카메라, GPS 수신기와 같은 다른 Android 기기에서 볼 수 있는 하드웨어 기능이 포함되어 있지 않습니다. TV는 보조 하드웨어 기기에 완전히 의존합니다. 사용자가 TV 앱과 상호작용하려면 리모컨이나 게임 패드를 사용해야 합니다. 다양한 입력 방법에 관한 자세한 내용은 TV 컨트롤러 관리를 참고하세요.
TV용 앱을 빌드할 때는 TV 하드웨어에서 작동하는 하드웨어 제한사항과 요구사항을 신중하게 고려해야 합니다. 앱이 TV에서 실행 중인지 확인하고 지원되지 않는 하드웨어 기능을 처리합니다.
TV 기기 확인
TV 기기와 다른 기기에서 모두 작동하는 앱을 빌드하는 경우 앱이 실행 중인 기기의 종류를 확인하고 앱의 작동을 조정해야 할 수 있습니다. 예를 들어 Intent를 통해 시작할 수 있는 앱이 있는 경우 기기 속성을 확인하여 TV 지향 활동을 시작할지 아니면 휴대전화 활동을 시작할지 결정합니다.
앱이 TV 기기에서 실행 중인지 확인하는 권장 방법은 PackageManager.hasSystemFeature 메서드를 사용하여 기기가 텔레비전 모드에서 실행 중인지 확인하는 것입니다. 다음 예시 코드는 앱이 TV 기기에서 실행 중인지 확인하는 방법을 보여줍니다.
Kotlin
const val TAG = "DeviceTypeRuntimeCheck" val isTelevision = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) if (isTelevision) { Log.d(TAG, "Running on a TV Device") } else { Log.d(TAG, "Running on a non-TV Device") }
자바
public static final String TAG = "DeviceTypeRuntimeCheck"; boolean isTelevision = getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); if (isTelevision) { Log.d(TAG, "Running on a TV Device"); } else { Log.d(TAG, "Running on a non-TV Device"); }
지원되지 않는 하드웨어 기능 처리
앱의 디자인과 기능에 따라 특정 하드웨어 기능을 사용할 수 없는 경우를 해결할 수 있습니다. 이 섹션에서는 일반적으로 TV에서 사용할 수 없는 하드웨어 기능, 누락된 하드웨어 기능을 감지하는 방법, 이러한 기능에 제안되는 대안을 설명합니다.
지원되지 않는 TV 하드웨어 기능
TV는 다른 기기와 목적이 다르므로 다른 Android 지원 기기에 있는 하드웨어 기능이 없습니다. 이러한 이유로 Android 시스템은 TV 기기에서 다음 기능을 지원하지 않습니다.
| 하드웨어 | Android 기능 설명자 |
|---|---|
| 터치스크린 | android.hardware.touchscreen |
| 터치스크린 에뮬레이터 | android.hardware.faketouch |
| 텔레포니 | android.hardware.telephony |
| 카메라 | android.hardware.camera |
| 근거리 무선통신(NFC) | android.hardware.nfc |
| GPS | android.hardware.location.gps |
| 마이크 | android.hardware.microphone |
| 센서 | android.hardware.sensor |
| 세로 방향 화면 | android.hardware.screen.portrait |
참고: 일부 TV 컨트롤러에는 마이크가 있지만, 이는 여기에 설명된 마이크 하드웨어 기능과 다릅니다. 컨트롤러 마이크가 완전히 지원됩니다.
기능, 하위 기능, 설명어의 전체 목록은 기능 참조를 확인하세요.
TV 하드웨어 요구사항 선언
Android 앱은 앱 매니페스트에서 하드웨어 기능 요구사항을 선언하여 이러한 기능을 제공하지 않는 기기에 설치되지 않도록 할 수 있습니다. TV에서 사용하기 위해 기존 앱을 확장하는 경우 앱의 매니페스트에서 TV 기기에 설치되지 못하게 할 수 있는 하드웨어 요구사항 선언이 있는지 자세히 검토하세요.
앱이 TV에서 사용할 수 없는 하드웨어 기능(예: 터치스크린, 카메라)을 사용하지만 이러한 기능을 사용하지 않고도 작동할 수 있다면 앱의 매니페스트를 수정하여 해당 기능이 필요하지 않음을 알려야 합니다. 다음 매니페스트 코드 스니펫은 앱이 TV 기기에서 사용할 수 없는 하드웨어 기능을 필요로 하지 않지만 TV가 아닌 기기에서는 이러한 기능을 사용한다고 선언하는 방법을 보여줍니다.
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/> <uses-feature android:name="android.hardware.faketouch" android:required="false"/> <uses-feature android:name="android.hardware.telephony" android:required="false"/> <uses-feature android:name="android.hardware.camera" android:required="false"/> <uses-feature android:name="android.hardware.nfc" android:required="false"/> <uses-feature android:name="android.hardware.location.gps" android:required="false"/> <uses-feature android:name="android.hardware.microphone" android:required="false"/> <uses-feature android:name="android.hardware.sensor" android:required="false"/> <!-- Some TV devices have an ethernet connection only --> <uses-feature android:name="android.hardware.wifi" android:required="false"/>
참고:
기능 참조에 설명된 대로 일부 기능에는 android.hardware.camera.front와 같은 하위 기능이 있습니다. 앱에서 사용되는 하위 기능도 required="false"로 표시해야 합니다.
TV 기기에서 사용하도록 고안된 모든 앱은 TV 앱 시작하기에 설명된 대로 터치스크린 기능이 필요하지 않다고 선언해야 합니다. 앱이 일반적으로 TV 기기에서 지원되지 않는 기능을 하나 이상 사용하는 경우 매니페스트에서 이러한 기능의 android:required 속성 설정을 false로 변경합니다.
주의: 하드웨어 기능을 필수 항목으로 선언하고 값을 true로 설정하면 앱이 TV 기기에 설치되지 않거나 Android TV 홈 화면 런처에 표시되지 않습니다.
하드웨어 기능을 암시하는 권한에 유의하기
일부 uses-permission 매니페스트 선언은 하드웨어 기능을 암시합니다. 이 동작은 앱 매니페스트에서 일부 권한을 요청하면 앱이 TV 기기에 설치 및 사용되지 못하도록 제외될 수 있음을 의미합니다. 일반적으로 요청되는 다음 권한은 암시적 하드웨어 기능 요구사항을 만듭니다.
| 권한 | 암시적 하드웨어 기능 |
|---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera 및 android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
일부 TV 기기에는 이더넷 연결만 있습니다. |
하드웨어 기능 요구사항을 암시하는 권한 요청의 전체 목록은 uses-feature 가이드를 참고하세요. 앱이 이전에 나열된 기능 중 하나를 요청하는 경우 매니페스트에 암시된 하드웨어 기능이 필요하지 않음을 나타내는 uses-feature 선언을 포함합니다. android:required="false".
참고: 앱이 Android 5.0 (API 수준 21) 이상을 타겟팅하고 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION 권한을 사용하는 경우, TV 기기에 네트워크 카드나 GPS 수신기가 없더라도 사용자는 TV 기기에 앱을 설치할 수 있습니다.
앱에서 하드웨어 기능을 선택사항으로 설정한 후에는 런타임에 이러한 기능의 사용 가능 여부를 확인한 다음 앱의 동작을 조정해야 합니다. 다음 섹션에서는 하드웨어 기능을 확인하는 방법을 설명하고 앱의 동작을 변경하는 몇 가지 접근 방식을 제안합니다.
매니페스트에서 기능을 필터링하고 선언하는 방법에 관한 자세한 내용은 uses-feature 가이드를 참고하세요.
하드웨어 기능 확인
Android 프레임워크는 앱이 실행 중인 기기에서 하드웨어 기능을 사용할 수 없는 경우 이를 알려줍니다. hasSystemFeature(String) 메서드를 사용하여 런타임 시 특정 기능을 확인합니다. 이 메서드는 확인하려는 기능을 지정하는 단일 문자열 인수를 사용합니다.
다음 코드 예는 런타임에 하드웨어 기능의 사용 가능 여부를 감지하는 방법을 보여줍니다.
Kotlin
// Check whether the telephony hardware feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { Log.d("HardwareFeatureTest", "Device can make phone calls") } // Check whether android.hardware.touchscreen feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { Log.d("HardwareFeatureTest", "Device has a touchscreen.") }
자바
// Check whether the telephony hardware feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { Log.d("HardwareFeatureTest", "Device can make phone calls"); } // Check whether android.hardware.touchscreen feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { Log.d("HardwareFeatureTest", "Device has a touchscreen."); }
터치스크린
대부분의 TV 기기에는 터치 스크린이나 포인터 입력 기능이 없으며 탐색을 위해 방향 패드 (D패드) 리모컨에 전적으로 의존합니다. TV 앱은 항상 D패드 리모컨을 지원해야 합니다.
TV 친화적인 컨트롤을 사용하여 탐색을 올바르게 지원하는 방법에 관한 자세한 내용은 TV 탐색을 참고하세요.
터치 지원 선언
일부 TV 기기는 포인터 리모컨과 터치스크린 디스플레이를 지원합니다. 앱은 휴대기기에서와 같이 클릭, 마우스 오버, 스크롤 상호작용을 지원하여 이러한 상호작용을 지원하는 기기에서 더 나은 환경을 제공할 수 있습니다.
앱에서 터치 모드를 허용하는 경우 AndroidManifest.xml의 <application> 또는 <activity> 요소 내에 true로 설정된 android.software.leanback.supports_touch
<property> 요소를 추가하여 전체 앱 또는 개별 활동에 터치 지원을 선언할 수 있습니다.
<application ...> <property android:name="android.software.leanback.supports_touch" android:value="true|false" /> ... </application>
참고: 포인팅 리모컨 (예: 에어 마우스 또는 트랙패드)을 지원하는 기기에서 이 기능을 사용 설정하면 플랫폼 호환성 에뮬레이션에 의존하는 대신 커서 및 터치 모드가 사용 설정됩니다. 활동 수준 선언은 해당 활동의 애플리케이션 수준 선언을 재정의합니다. 이 속성을 생략하면 기본값은 false입니다.
카메라
TV에는 일반적으로 카메라가 없지만 TV에서 사진 관련 앱을 제공할 수 있습니다. 예를 들어 사진을 찍고 보고 수정하는 앱이 있다면 TV용 사진 촬영 기능을 사용 중지하고 사용자가 사진을 보고 수정할 수 있도록 할 수 있습니다. 카메라 관련 앱이 TV에서 작동하도록 하려면 앱 매니페스트에 다음 기능 선언을 추가합니다.
<uses-feature android:name="android.hardware.camera" android:required="false" />
카메라 없이 앱을 실행할 수 있도록 설정하는 경우 카메라 기능을 사용할 수 있는지 감지하고 앱 작동을 조정하는 코드를 앱에 추가합니다. 다음 코드 예는 카메라의 존재를 감지하는 방법을 보여줍니다.
Kotlin
// Check whether the camera hardware feature is available. if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.d("Camera test", "Camera available!") } else { Log.d("Camera test", "No camera available. View and edit features only.") }
자바
// Check whether the camera hardware feature is available. if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.d("Camera test", "Camera available!"); } else { Log.d("Camera test", "No camera available. View and edit features only."); }
GPS
TV는 고정된 실내 기기이며 내장 위성 위치 확인 시스템 (GPS) 수신기가 없습니다. 앱에서 위치 정보를 사용하는 경우에도 사용자가 위치를 검색하도록 하거나 TV 기기 설정 중에 구성된 우편번호와 같은 정적 위치 정보 제공자를 사용하도록 할 수 있습니다.
Kotlin
// Request a static location from the location manager. val locationManager = this.getSystemService(Context.LOCATION_SERVICE) as LocationManager val location = locationManager.getLastKnownLocation("static") if (location == null) { Log.e(TAG, "Location is null") return } // Attempt to get postal code from the static location object. val geocoder = Geocoder(this) val address: Address? = try { geocoder.getFromLocation(location.latitude, location.longitude, 1)?.firstOrNull() ?.apply { Log.d(TAG, postalCode) } } catch (e: IOException) { Log.e(TAG, "Geocoder error", e) null }
자바
// Request a static location from the location manager. LocationManager locationManager = (LocationManager) this.getSystemService( Context.LOCATION_SERVICE); Location location = locationManager.getLastKnownLocation("static"); // Attempt to get postal code from the static location object. Geocoder geocoder = new Geocoder(this); Address address = null; try { address = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1).get(0); Log.d("Postal code", address.getPostalCode()); } catch (IOException e) { Log.e(TAG, "Geocoder error", e); }
저전력 모드 중 재생 일시중지
일부 TV 기기는 사용자가 기기를 끌 때 저전력 모드를 지원합니다. 기기는 종료되는 대신 디스플레이를 사용 중지하고 Android TV를 백그라운드에서 계속 실행합니다. 이 모드에서는 오디오 출력이 계속 사용 설정되므로 기기가 저전력 모드일 때는 현재 재생 중인 콘텐츠를 중지합니다.
저전력 모드 중에 재생되지 않도록 하려면 onStop를 재정의하고 현재 재생 중인 콘텐츠를 중지합니다.
Kotlin
override fun onStop() { // App-specific method to stop playback. stopPlayback() super.onStop() }
자바
@Override public void onStop() { // App-specific method to stop playback. stopPlayback(); super.onStop(); }
사용자가 전원을 다시 켜면 앱이 활성 포그라운드 앱인 경우 onStart가 호출됩니다. 활동 시작 및 중지에 관한 자세한 내용은
활동 수명 주기를 참고하세요.