處理 TV 硬體

電視硬體與其他 Android 裝置有很大的差異。電視不可 包含其他 Android 裝置所提供的硬體功能,例如觸控螢幕 攝影機和 GPS 接收器電視也完全仰賴次要硬體裝置: 必須使用遙控器或遊戲手把,才能與電視應用程式互動。(如要瞭解 各種輸入法,請參閱管理電視遙控器)。

開發 Android TV 應用程式時,請審慎考量硬體限制和 在電視硬體上運作檢查應用程式是否在電視上執行,並處理不支援的問題 硬體功能

檢查是否有電視裝置

如果您建構的應用程式可同時在 TV 裝置和其他裝置上運作,您可能需要 請查看執行應用程式的裝置類型,並調整應用程式的運作情形。適用對象 例如,如果您有可透過 Intent 啟動的應用程式 請查看裝置屬性,判斷是否要啟動電視導向廣告 活動或手機活動

如要判斷應用程式是否在電視裝置上執行,建議您使用 PackageManager.hasSystemFeature() 方法進行檢查 檢查裝置是否在電視模式下執行。下列程式碼範例說明如何檢查 應用程式正在電視裝置上執行:

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

處理不支援的硬體功能

視應用程式的設計和功能而定,您或許能夠解決某些 硬體功能就無法使用本節會探討一般硬體功能 不支援電視、如何偵測遺失的硬體功能,以及建議可採用的替代方案 這些功能。

不支援的電視硬體功能

電視的用途與其他裝置不同,因此不具備 其他 Android 裝置則經常使用這種連線方式。因此 Android 系統無法支援 下列電視裝置功能:

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

注意:部分電視遙控器具有麥克風, 與本文所述的麥克風硬體功能不同。遙控器麥克風已全部 支援。

請參閱 功能參考資料:內含內含項目、子功能及相關描述元的完整清單。

宣告電視的硬體需求

Android 應用程式可以在應用程式資訊清單中宣告硬體功能需求,確保 並未安裝在不支援這些功能的裝置上。如果您要擴充現有的 以便在電視上使用應用程式,請詳閱應用程式的資訊清單,確認是否有任何硬體需求 宣告可能導致裝置無法安裝於 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 會讓無法在電視上安裝您的應用程式 或在 Android TV 主畫面啟動器中顯示。

留意隱含硬體功能的權限

部分 uses-permission 資訊清單宣告隱含硬體功能。也就是說 應用程式資訊清單中的權限,即可讓使用者無法安裝您的應用程式並在電視上使用 裝置。下列常用權限建立隱含硬體功能 要求:

權限 隱含硬體功能
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

部分電視裝置只能使用乙太網路連線。

如需隱含硬體功能需求的權限要求完整清單,請參閱 uses-feature敬上 指南。如果應用程式需要使用上述功能,請加入 uses-feature敬上 宣告隱含硬體功能,但聲明並非 這通常代表交易 不會十分要求關聯語意android:required="false"

注意:如果應用程式指定 Android 5.0 (API 級別 21) 或 且使用 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION權限,使用者仍可安裝 。 接收器。

為應用程式選擇選用硬體功能後,您必須檢查 並調整應用程式行為。下一個區段 針對如何檢查硬體功能,以及針對變更 應用程式的行為。

如要進一步瞭解如何在資訊清單中篩選及宣告功能,請參閱 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.");
}

觸控螢幕

由於大部分的電視沒有觸控螢幕,Android 並不支援觸控螢幕互動 電視裝置。此外,觸控螢幕與顯示環境不一致, 使用者坐在離顯示器 10 英尺遠。請確認您的 UI 元素和文字不會 需要或暗示使用觸控螢幕

如果是 TV 裝置,請將應用程式設計要能支援 透過電視遙控器使用方向鍵 (D-Pad) 進行瀏覽。如要進一步瞭解 透過易於電視的控制系統正確支援導覽,詳情請參閱 電視導航

相機

雖然電視通常沒有相機,但您還是可以提供與攝影相關的內容。 在電視上觀看 YouTube 應用程式舉例來說,如果您有一款可拍攝、檢視及編輯相片的應用程式,則可以執行以下動作: 停用電視的拍攝功能,仍允許使用者查看甚至編輯 相簿。如果您決定讓相機相關應用程式在電視上運作,請將 應用程式資訊清單,宣告下列功能:

<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

電視為靜止的室內裝置,未內建全球定位系統 (GPS) 接收器。如果您的應用程式會使用位置資訊,您仍然可以讓使用者搜尋 位置資訊或使用靜態地點提供者,例如電視裝置設定的郵遞區號 設定。

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

在低耗電模式下暫停播放

部分電視裝置可在使用者關閉裝置時支援低耗電模式。 裝置會停用螢幕並保留 Android 裝置,而不是關機 電視正在背景執行。此模式仍在啟用音訊輸出功能,因此 在裝置處於低耗電模式時,停止目前正在播放的內容。

為了避免在低耗電模式下播放影片,請覆寫 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() 如果您的應用程式為使用中的前景應用程式。進一步瞭解如何開始和停止 1 項活動 活動生命週期