จัดการฮาร์ดแวร์ทีวี

ฮาร์ดแวร์ของทีวีแตกต่างจากอุปกรณ์ 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

ตระหนักถึงสิทธิ์ที่บอกเป็นนัยถึงฟีเจอร์ของฮาร์ดแวร์

ประมาณ uses-permission การประกาศไฟล์ Manifest หมายถึงฟีเจอร์ฮาร์ดแวร์ ซึ่งหมายความว่าการขอ สิทธิ์ในไฟล์ Manifest ของแอปอาจยกเว้นไม่ให้มีการติดตั้งและใช้แอปบนทีวี อุปกรณ์ สิทธิ์ที่ขอกันโดยทั่วไปซึ่งสร้างฟีเจอร์ของฮาร์ดแวร์โดยนัย ข้อกำหนด

สิทธิ์ ฟีเจอร์ฮาร์ดแวร์โดยนัย
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 ในไฟล์ 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.");
}

หน้าจอสัมผัส

เนื่องจากทีวีส่วนใหญ่ไม่มีหน้าจอสัมผัส Android จึงไม่สนับสนุนการโต้ตอบกับหน้าจอสัมผัสสำหรับ อุปกรณ์ทีวี นอกจากนี้ การใช้หน้าจอสัมผัส ไม่สอดคล้องกับสภาพแวดล้อมการรับชม ผู้ใช้นั่งห่างจากจอแสดงผล 10 ฟุต ตรวจสอบว่าองค์ประกอบ UI และข้อความไม่แสดง จำเป็นต้องใช้หรือบอกเป็นนัยถึงการใช้หน้าจอสัมผัส

สำหรับอุปกรณ์ทีวี ให้ออกแบบแอปให้รองรับ การนำทางโดยใช้ปุ่มบังคับทิศทาง (D-pad) บนรีโมตคอนโทรลทีวี สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ ที่รองรับการนำทางอย่างเหมาะสมโดยใช้การควบคุมที่เหมาะกับทีวี โปรดดู การนำทางในทีวี

กล้อง

แม้ว่าทีวีมักจะไม่มีกล้อง แต่คุณก็สามารถให้ภาพที่เกี่ยวกับการถ่ายภาพได้ บนทีวี ตัวอย่างเช่น หากมีแอปที่ถ่ายภาพ ดู และแก้ไขรูปภาพ คุณสามารถ ปิดฟังก์ชันการถ่ายภาพสำหรับทีวีและยังให้ผู้ใช้ดูและแก้ไขได้ รูปภาพ หากคุณตัดสินใจอนุญาตให้แอปที่เกี่ยวข้องกับกล้องทำงานบนทีวี ให้เพิ่ม การประกาศฟีเจอร์ต่อไปนี้สำหรับไฟล์ 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 ไว้แทนการปิดเครื่อง ทีวีทำงานอยู่เบื้องหลัง เอาต์พุตเสียงยังคงเปิดใช้งานในโหมดนี้ ดังนั้น หยุดเนื้อหาที่เล่นอยู่ในปัจจุบันเมื่ออุปกรณ์อยู่ในโหมดพลังงานต่ำ

หากต้องการหลีกเลี่ยงการเล่นในโหมดใช้พลังงานต่ำ ให้ลบล้าง 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() หากแอปเป็นแอปที่ทำงานอยู่เบื้องหน้า ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้นและการหยุด กิจกรรม โปรดดู วงจรกิจกรรม