ฮาร์ดแวร์ทีวีแตกต่างจากอุปกรณ์ Android อื่นๆ อย่างมาก ทีวีไม่มี ฟีเจอร์ฮาร์ดแวร์บางอย่างที่พบในอุปกรณ์ Android อื่นๆ เช่น หน้าจอสัมผัส กล้อง และเครื่องรับสัญญาณ GPS นอกจากนี้ ทีวียังต้องพึ่งพาอุปกรณ์ฮาร์ดแวร์รองอย่างสมบูรณ์: ผู้ใช้ต้องใช้รีโมตคอนโทรลหรือเกมแพดเพื่อโต้ตอบกับแอปทีวี (ดูข้อมูลเกี่ยวกับ วิธีการป้อนข้อมูลต่างๆ ได้ที่หัวข้อจัดการตัวควบคุมทีวี)
เมื่อสร้างแอปสำหรับทีวี ให้พิจารณาข้อจำกัดและข้อกำหนดด้านฮาร์ดแวร์ของ การทำงานบนฮาร์ดแวร์ทีวีอย่างรอบคอบ ตรวจสอบว่าแอปทำงานบนทีวีหรือไม่ และจัดการฟีเจอร์ฮาร์ดแวร์ที่ไม่รองรับ
ตรวจสอบอุปกรณ์ทีวี
หากคุณกำลังสร้างแอปที่ทำงานได้ทั้งบนอุปกรณ์ทีวีและอุปกรณ์อื่นๆ คุณอาจต้อง
ตรวจสอบว่าแอปทำงานบนอุปกรณ์ประเภทใดและปรับการทำงานของแอป ตัวอย่างเช่น หากคุณมีแอปที่เริ่มทำงานผ่าน 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 |
| Near Field Communications (NFC) | android.hardware.nfc |
| GPS | android.hardware.location.gps |
| ไมโครโฟน | android.hardware.microphone |
| เซ็นเซอร์ | android.hardware.sensor |
| หน้าจอในแนวตั้ง | android.hardware.screen.portrait |
หมายเหตุ: ตัวควบคุมทีวีบางตัวมีไมโครโฟน ซึ่ง ไม่เหมือนกับฟีเจอร์ฮาร์ดแวร์ไมโครโฟนที่อธิบายไว้ที่นี่ ระบบรองรับไมโครโฟนของตัวควบคุมอย่างเต็มที่
ดูรายการฟีเจอร์ ฟีเจอร์ย่อย และตัวอธิบายทั้งหมดได้ที่ข้อมูลอ้างอิงฟีเจอร์
ประกาศข้อกำหนดด้านฮาร์ดแวร์สำหรับทีวี
แอป Android สามารถประกาศข้อกำหนดด้านฟีเจอร์ฮาร์ดแวร์ในไฟล์ Manifest ของแอปเพื่อช่วยให้มั่นใจ ว่าจะไม่มีการติดตั้งแอปในอุปกรณ์ที่ไม่มีฟีเจอร์เหล่านั้น หากคุณกำลังขยายแอปที่มีอยู่ เพื่อใช้ในทีวี โปรดตรวจสอบไฟล์ Manifest ของแอปอย่างละเอียดเพื่อดูการประกาศข้อกำหนดด้านฮาร์ดแวร์ ที่อาจทำให้แอปติดตั้งในอุปกรณ์ทีวีไม่ได้
หากแอปของคุณใช้ฟีเจอร์ฮาร์ดแวร์ เช่น หน้าจอสัมผัสหรือกล้อง ซึ่งไม่มีใน ทีวี แต่แอปทำงานได้โดยไม่ต้องใช้ฟีเจอร์เหล่านั้น ให้แก้ไขไฟล์ Manifest ของแอปเพื่อ ระบุว่าไม่จำเป็นต้องใช้ฟีเจอร์เหล่านี้ ข้อมูลโค้ด Manifest ต่อไปนี้ แสดงวิธีประกาศว่าแอปของคุณไม่จำเป็นต้องใช้ฟีเจอร์ฮาร์ดแวร์ที่ไม่มี ในอุปกรณ์ทีวี แต่ใช้ฟีเจอร์เหล่านั้นในอุปกรณ์ที่ไม่ใช่ทีวี
<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"
แอปทั้งหมดที่ตั้งใจให้ใช้ในอุปกรณ์ทีวีต้องประกาศว่าไม่จำเป็นต้องใช้ฟีเจอร์หน้าจอสัมผัส
ตามที่อธิบายไว้ในหัวข้อเริ่มต้นใช้งาน
แอปทีวี หากแอปของคุณปกติใช้ฟีเจอร์อย่างน้อย 1 รายการที่อุปกรณ์ทีวีไม่รองรับ ให้เปลี่ยนการตั้งค่าแอตทริบิวต์
android:required เป็น false สำหรับฟีเจอร์เหล่านั้นในไฟล์ Manifest
ข้อควรระวัง: การประกาศฟีเจอร์ฮาร์ดแวร์ว่าจำเป็นโดยตั้งค่า
เป็น true จะทำให้แอปของคุณติดตั้งในอุปกรณ์ทีวี
ไม่ได้หรือปรากฏใน Launcher ของหน้าจอหลัก Android TV ไม่ได้
โปรดทราบว่าสิทธิ์บางอย่างหมายถึงฟีเจอร์ฮาร์ดแวร์
การประกาศไฟล์ Manifest บางรายการ uses-permission
หมายถึงฟีเจอร์ฮาร์ดแวร์ ลักษณะการทำงานนี้หมายความว่าการขอสิทธิ์บางอย่างในไฟล์ Manifest ของแอปอาจทำให้แอปของคุณไม่สามารถติดตั้งและใช้งานในอุปกรณ์ทีวีได้ สิทธิ์ที่ขอโดยทั่วไปต่อไปนี้จะสร้างข้อกำหนดด้านฟีเจอร์ฮาร์ดแวร์
โดยนัย
| สิทธิ์ | ฟีเจอร์ฮาร์ดแวร์โดยนัย |
|---|---|
RECORD_AUDIO |
android.hardware.microphone |
CAMERA |
android.hardware.camera และ android.hardware.camera.autofocus |
ACCESS_COARSE_LOCATION |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
อุปกรณ์ทีวีบางเครื่องมีการเชื่อมต่ออีเทอร์เน็ตเท่านั้น |
ดูรายการคำขอสิทธิ์ทั้งหมดที่หมายถึงข้อกำหนดด้านฟีเจอร์ฮาร์ดแวร์ได้ที่
uses-feature
คู่มือ หากแอปของคุณขอฟีเจอร์ใดฟีเจอร์หนึ่งที่ระบุไว้ก่อนหน้านี้ ให้ใส่การประกาศ
uses-feature
ในไฟล์ Manifest สำหรับฟีเจอร์ฮาร์ดแวร์โดยนัยที่ระบุว่าไม่
จำเป็น android:required="false"
หมายเหตุ: หากแอปของคุณกำหนดเป้าหมายเป็น Android 5.0 (ระดับ API 21) ขึ้นไปและใช้สิทธิ์ ACCESS_COARSE_LOCATION หรือ ACCESS_FINE_LOCATION ผู้ใช้จะยังคงติดตั้งแอปของคุณในอุปกรณ์ทีวีได้ แม้ว่าอุปกรณ์ทีวีจะไม่มีการ์ดเครือข่ายหรือเครื่องรับสัญญาณ GPS
หลังจากทำให้ฟีเจอร์ฮาร์ดแวร์เป็นตัวเลือกสำหรับแอปแล้ว คุณต้องตรวจสอบความพร้อมใช้งานของฟีเจอร์เหล่านั้นในรันไทม์ แล้วปรับลักษณะการทำงานของแอป ส่วนถัดไป จะอธิบายวิธีตรวจสอบฟีเจอร์ฮาร์ดแวร์และแนะนำแนวทางบางอย่างในการเปลี่ยนลักษณะการทำงานของแอป
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกรองและการประกาศฟีเจอร์ในไฟล์ Manifest ได้ที่
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."); }
หน้าจอสัมผัส
อุปกรณ์ทีวีส่วนใหญ่ไม่มีหน้าจอสัมผัสหรือความสามารถในการป้อนข้อมูลด้วยตัวชี้ และต้องใช้ รีโมตคอนโทรลแป้นทิศทาง (D-pad) อย่างเต็มที่ในการนำทาง แอปทีวีต้องรองรับรีโมตคอนโทรล D-pad เสมอ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการรองรับการนำทางอย่างเหมาะสมโดยใช้ตัวควบคุมที่เหมาะกับทีวีได้ที่ การนำทางในทีวี
ประกาศการรองรับระบบสัมผัส
อุปกรณ์ทีวีบางเครื่องรองรับรีโมตตัวชี้และจอแสดงผลหน้าจอสัมผัส แอปของคุณสามารถรองรับการโต้ตอบแบบคลิก วางเมาส์เหนือ และเลื่อน เช่น ในอุปกรณ์เคลื่อนที่ เพื่อมอบประสบการณ์การใช้งานที่ดียิ่งขึ้นในอุปกรณ์ ที่รองรับ
หากแอปอนุญาตให้ใช้โหมดสัมผัส คุณสามารถประกาศการรองรับระบบสัมผัสได้โดยเพิ่ม android.software.leanback.supports_touch เป็น true ใน AndroidManifest.xml
<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>
หมายเหตุ: ในอุปกรณ์ที่รองรับรีโมตตัวชี้ (เช่น เมาส์อากาศหรือแทร็กแพด) การเปิดใช้ตัวเลือกนี้
จะเปิดใช้โหมดเคอร์เซอร์และโหมดสัมผัสแทนที่จะใช้การจำลองความเข้ากันได้ของแพลตฟอร์ม หากไม่ใส่ข้อมูลเมตา
ระบบจะใช้ค่าเริ่มต้นเป็น false
กล้อง
แม้ว่าโดยทั่วไปแล้วทีวีจะไม่มีกล้อง แต่คุณก็ยังสามารถให้บริการแอปที่เกี่ยวข้องกับการถ่ายภาพ ในทีวีได้ ตัวอย่างเช่น หากคุณมีแอปที่ถ่าย ดู และแก้ไขรูปภาพ คุณสามารถ ปิดใช้ฟังก์ชันการถ่ายรูปสำหรับทีวี และยังคงอนุญาตให้ผู้ใช้ดูและแก้ไข รูปภาพได้ หากตัดสินใจเปิดใช้แอปที่เกี่ยวข้องกับกล้องให้ทำงานบนทีวี ให้เพิ่ม การประกาศฟีเจอร์ต่อไปนี้ลงในไฟล์ Manifest ของแอป
<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 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() หากแอปของคุณเป็นแอปที่ทำงานอยู่เบื้องหน้า ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มและหยุดกิจกรรมได้ที่
วงจรกิจกรรม