TV 하드웨어 처리

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")
}

Java

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

android.hardware.location

android.hardware.location.network (API 수준 20 이하만 타겟팅)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (API 수준 20 이하만 타겟팅)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

일부 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.")
}

Java

// 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에는 터치스크린이 없으므로 Android는 TV 기기의 터치스크린 상호작용을 지원하지 않습니다. 또한 터치스크린 사용은 사용자가 디스플레이에서 3m 떨어진 곳에 앉는 시청 환경에 적합하지 않습니다. UI 요소와 텍스트가 터치스크린 사용을 요구하거나 암시하지 않도록 해야 합니다.

TV 기기의 경우 TV 리모컨의 방향 패드 (D패드)를 사용한 탐색을 지원하도록 앱을 설계합니다. TV용 컨트롤을 사용한 내비게이션을 올바르게 지원하는 방법에 관한 자세한 내용은 TV 탐색을 참고하세요.

카메라

일반적으로 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.")
}

Java

// 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: Location = locationManager.getLastKnownLocation("static")

// 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)[0]
                    .apply {
                        Log.d(TAG, postalCode)
                    }
        } catch (e: IOException) {
            Log.e(TAG, "Geocoder error", e)
            null
        }

Java

// 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()
}

Java

@Override
public void onStop() {
  // App-specific method to stop playback.
  stopPlayback();
  super.onStop();
}

사용자가 전원을 다시 켜면 앱이 활성 포그라운드 앱인 경우 onStart()가 호출됩니다. 활동 시작 및 중지에 관한 자세한 내용은 활동 수명 주기를 참고하세요.