TV 하드웨어 처리

TV 하드웨어는 다른 Android 기기와 상당히 다릅니다. TV에는 터치스크린, 카메라, GPS 수신기 등 다른 Android 기기에서 볼 수 있는 일부 하드웨어 기능이 포함되어 있지 않습니다. 또한, 보조 하드웨어 기기에 완전히 종속되어 있습니다. 사용자가 TV 앱과 상호작용하려면 리모컨이나 게임 패드를 사용해야 합니다. TV 앱을 빌드하는 경우 TV 하드웨어에서 작동할 때 필요한 하드웨어 제한 및 요구사항을 신중하게 고려해야 합니다.

이 과정에서는 앱이 TV에서 실행되는지 확인하는 방법과 지원되지 않는 하드웨어 기능을 처리하는 방법을 보여줍니다. 다양한 입력 방법을 자세히 알아보려면 TV 컨트롤러 관리를 참조하세요.

TV 기기 확인

TV 기기와 다른 기기에서 모두 작동하는 앱을 빌드하는 경우 앱이 실행되는 기기의 종류를 확인하고 앱 작동을 수정해야 할 수 있습니다. 예를 들어 Intent를 통해 시작할 수 있는 앱이 있는 경우 해당 애플리케이션에서 기기 속성을 확인하여 TV 지향적 활동을 시작할지 스마트폰 활동을 시작할지 결정해야 합니다.

앱이 TV 기기에서 실행되는지 확인하기 위해서는 UiModeManager.getCurrentModeType() 메서드를 사용해 기기가 텔레비전 모드로 실행되는지 확인하는 것이 좋습니다. 다음 코드 예에서는 앱이 TV 기기에서 실행되는지 확인하는 방법을 보여줍니다.

Kotlin

    const val TAG = "DeviceTypeRuntimeCheck"

    val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
    if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
        Log.d(TAG, "Running on a TV Device")
    } else {
        Log.d(TAG, "Running on a non-TV Device")
    }
    

자바

    public static final String TAG = "DeviceTypeRuntimeCheck";

    UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
    if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
        Log.d(TAG, "Running on a TV Device");
    } else {
        Log.d(TAG, "Running on a non-TV Device");
    }
    

지원되지 않는 하드웨어 기능 처리

앱의 디자인과 기능에 따라 사용할 수 없는 특정 하드웨어 기능을 처리할 수 있습니다. 이 섹션은 일반적으로 TV에서 사용할 수 없는 하드웨어 기능과 누락된 하드웨어 기능을 감지하는 방법을 설명하고 이러한 기능 사용의 대안을 제시합니다.

지원되지 않는 TV 하드웨어 기능

TV는 다른 기기와는 사용 목적이 다르므로, 다른 Android 구동 기기에 있는 하드웨어 기능이 TV에는 없는 경우가 많습니다. 따라서 Android 시스템은 TV 기기에서 다음 기능을 지원하지 않습니다.

하드웨어 Android 기능 설명자
터치스크린 android.hardware.touchscreen
터치스크린 에뮬레이터 android.hardware.faketouch
텔레포니 android.hardware.telephony
카메라 android.hardware.camera
근거리 무선통신(NFC) android.hardware.nfc
GPS android.hardware.location.gps
마이크 [1] android.hardware.microphone
센서 android.hardware.sensor
세로 방향 화면 android.hardware.screen.portrait

[1] 일부 TV 컨트롤러에는 마이크가 있습니다. 해당 마이크는 여기에서 설명하는 마이크 하드웨어 기능과는 다릅니다. 컨트롤러 마이크는 완전하게 지원됩니다.

기능, 하위 기능, 설명자의 전체 목록은 기능 참조에서 확인해보세요.

TV용 하드웨어 요구사항 선언

Android 앱은 앱 manifest에 하드웨어 기능 요구사항을 선언하여 해당 기능을 제공하지 않는 기기에는 기능이 설치되지 않도록 할 수 있습니다. 기존 앱을 TV에서 사용하도록 확장하려면 TV 기기에 설치되는 것을 방지할 수 있는 하드웨어 요구사항 선언이 앱 manifest에 있는지 자세히 살펴보세요.

앱이 TV에서 사용할 수 없는 하드웨어 기능(예: 터치스크린 또는 카메라)을 사용하지만 해당 기능을 사용하지 않아도 작동할 수 있으면 앱에서 해당 기능을 요구하지 않는 것을 나타내도록 앱 manifest를 수정합니다. 다음 manifest 코드 스니펫은 앱이 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"/>
    

참고: 일부 기능에는 가능 참조에 설명된 android.hardware.camera.front와 같은 하위 기능이 있습니다. 앱에서 사용되는 하위 기능도 required="false"로 표시해야 합니다.

TV 기기에서 사용할 모든 앱은 TV 앱 시작하기에 설명된 대로 터치스크린 기능을 요구하지 않는 것을 선언해야 합니다. 일반적으로 앱이 위에 나열된 기능 중 하나 이상을 사용하는 경우 manifest에서 해당 기능의 android:required 속성 설정을 false로 변경합니다.

주의: 값을 true로 설정하여 하드웨어 기능을 요구하는 것으로 선언하면 앱이 TV 기기에 설치되지 않거나 Android TV 홈 화면 런처에 표시되지 않습니다.

앱에서 하드웨어 기능을 선택사항으로 지정하려면 런타임에 해당 기능의 가용성을 확인한 후 앱 동작을 조정해야 합니다. 다음 섹션에서는 하드웨어 기능을 확인하는 방법을 설명하고 앱 동작을 변경하는 몇 가지 방법을 제안합니다.

manifest에서 기능을 필터링하고 선언하는 방법에 관한 자세한 정보는 uses-feature 가이드를 참조하세요.

하드웨어 기능을 암시하는 권한 선언

일부 uses-permission manifest 선언은 하드웨어 기능을 암시합니다. 이러한 동작으로 앱 manifest에서 일부 권한을 요청하면 앱이 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 이하만 타겟팅합니다.)

하드웨어 기능 요구사항을 암시하는 권한 요청의 전체 목록을 보려면 uses-feature 가이드를 참조하세요. 앱이 위에 나열된 기능 중 하나를 요청하는 경우 암시적 하드웨어 기능이 필수가 아니라는 것(android:required="false")을 나타내는 uses-feature 선언을 기능 manifest에 포함해야 합니다.

참고: 앱이 Android 5.0(API 레벨 21) 이상을 타겟팅하고 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION 권한을 사용하는 경우에는 TV 기기에 네트워크 카드 또는 GPS 수신기가 없어도 사용자가 여전히 TV 기기에 해당 앱을 설치할 수 있습니다.

하드웨어 기능 확인

Android 프레임워크는 앱이 실행되는 기기에서 하드웨어 기능을 사용할 수 없는 경우 이를 알려줄 수 있습니다. hasSystemFeature(String) 메서드를 사용하여 런타임에 특정 기능을 확인합니다. 이 메서드는 확인하려는 기능을 지정하는 단일 문자열 인수를 사용합니다.

다음 코드 예에서는 런타임에 하드웨어 기능의 가용성을 감지하는 방법을 보여줍니다.

Kotlin

    // Check if the telephony hardware feature is available.
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
        Log.d("HardwareFeatureTest", "Device can make phone calls")
    }

    // Check if android.hardware.touchscreen feature is available.
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
        Log.d("HardwareFeatureTest", "Device has a touch screen.")
    }
    

자바

    // Check if the telephony hardware feature is available.
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
        Log.d("HardwareFeatureTest", "Device can make phone calls");
    }

    // Check if android.hardware.touchscreen feature is available.
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
        Log.d("HardwareFeatureTest", "Device has a touch screen.");
    }
    

터치스크린

대부분의 TV는 터치스크린 기능이 없으므로 Android는 TV 기기에서 터치스크린 상호작용을 지원하지 않습니다. 또한, 터치스크린 사용은 사용자가 화면에서 3m 정도 떨어져 앉게 되는 시청 환경에 맞지 않습니다. UI 요소와 텍스트가 터치스크린 사용을 요구하거나 암시하지 않도록 해야 합니다.

TV 기기의 경우, TV 리모컨의 방향 패드(D패드)를 사용하는 탐색을 지원하는 방법으로 앱이 이 상호작용 모델에서 작동하도록 디자인해야 합니다. TV용 컨트롤을 사용하는 탐색 기능을 적절히 지원하는 방법에 관한 정보는 TV 탐색 기능 만들기를 참조하세요.

카메라

일반적으로 TV에는 카메라가 없지만 TV에서 사진과 관련된 앱을 제공할 수는 있습니다. 예를 들어 사진을 촬영하고, 보고, 편집하는 앱이 있으면 TV의 경우 사진 촬영 기능은 사용 안함으로 설정하고 사용자가 사진을 보고 편집하는 기능은 허용할 수 있습니다. TV에서 카메라 관련 앱이 작동하게 하려면 앱 manifest에 다음 기능 선언을 추가합니다.

    <uses-feature android:name="android.hardware.camera" android:required="false" />
    

앱이 카메라 없이 실행되도록 하려면 카메라 기능을 사용할 수 있는지 감지하고 앱 작동을 조정하는 코드를 앱에 추가합니다. 다음 코드 예는 카메라가 있는지 감지하는 방법을 보여줍니다.

Kotlin

    // Check if 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 if 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 or zip 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
            }
    

자바

    // 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 or zip 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("Zip 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()가 호출됩니다. 활동 시작 및 중지에 관한 자세한 정보는 활동 수명 주기를 참조하세요.