Menangani hardware TV

Hardware TV jauh berbeda dengan perangkat Android lainnya. TV tidak menyertakan beberapa fitur hardware yang ada di perangkat Android lain, seperti layar sentuh, kamera, dan penerima GPS. TV juga sepenuhnya bergantung pada perangkat hardware sekunder: agar pengguna dapat berinteraksi dengan aplikasi TV, mereka harus menggunakan remote control atau game pad. Ketika membangun aplikasi untuk TV, Anda harus mempertimbangkan dengan cermat batasan hardware dan persyaratan pengoperasian hardware TV.

Panduan ini menunjukkan cara memeriksa apakah aplikasi Anda berjalan di TV, dan cara menangani fitur hardware yang tidak didukung. Untuk mempelajari berbagai metode input, lihat Mengelola pengontrol TV.

Memeriksa perangkat TV

Jika membuat aplikasi yang beroperasi di perangkat TV dan perangkat lainnya, Anda mungkin perlu memeriksa jenis perangkat yang menjalankan aplikasi Anda, dan menyesuaikan operasinya. Misalnya, jika Anda memiliki aplikasi yang dapat dimulai melalui Intent, periksa properti perangkat untuk menentukan apakah akan memulai aktivitas berorientasi TV atau aktivitas ponsel.

Cara yang direkomendasikan untuk menentukan apakah aplikasi Anda berjalan di perangkat TV adalah dengan menggunakan metode PackageManager.hasSystemFeature() untuk memeriksa apakah perangkat berjalan dalam mode televisi. Kode contoh berikut menunjukkan cara memeriksa apakah aplikasi Anda berjalan di perangkat 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");
}

Menangani fitur hardware yang tidak didukung

Bergantung pada desain dan fungsionalitas aplikasi, Anda mungkin bisa mengakali fitur hardware tertentu yang tidak tersedia. Bagian ini membahas fitur hardware yang biasanya tidak tersedia untuk TV, cara mendeteksi fitur hardware yang tidak ada, dan alternatif yang disarankan untuk fitur ini.

Fitur hardware TV yang tidak didukung

TV memiliki kegunaan yang berbeda dengan perangkat lainnya, sehingga tidak memiliki fitur hardware yang biasanya dimiliki perangkat Android lainnya. Karena alasan ini, sistem Android tidak mendukung fitur berikut untuk perangkat TV:

Hardware Deskriptor fitur Android
Layar sentuh android.hardware.touchscreen
Emulator layar sentuh android.hardware.faketouch
Telepon android.hardware.telephony
Kamera android.hardware.camera
Komunikasi Nirkabel Jarak Dekat (NFC) android.hardware.nfc
GPS android.hardware.location.gps
Mikrofon android.hardware.microphone
Sensor android.hardware.sensor
Layar berorientasi potret android.hardware.screen.portrait

Catatan: Beberapa pengontrol TV memiliki mikrofon, tetapi tidak sama dengan fitur hardware mikrofon yang dijelaskan di sini. Mikrofon pengontrol didukung sepenuhnya.

Lihat Referensi fitur untuk melihat daftar lengkap tentang fitur, subfitur, dan deskripsinya.

Mendeklarasikan persyaratan hardware untuk TV

Aplikasi Android dapat mendeklarasikan persyaratan fitur hardware dalam manifes aplikasi untuk membantu memastikan bahwa aplikasi tidak diinstal di perangkat yang tidak menyediakan fitur tersebut. Jika Anda memperluas aplikasi yang sudah ada untuk digunakan di TV, tinjau manifes aplikasi dengan cermat untuk mengetahui deklarasi persyaratan hardware yang mungkin mencegahnya diinstal di perangkat TV.

Jika aplikasi Anda menggunakan fitur hardware seperti layar sentuh atau kamera yang tidak tersedia di TV, tetapi dapat beroperasi tanpa penggunaan fitur tersebut, ubah manifes aplikasi untuk menunjukkan bahwa fitur ini tidak diperlukan. Cuplikan kode manifes berikut menunjukkan cara mendeklarasikan bahwa aplikasi Anda tidak memerlukan fitur hardware yang tidak tersedia di perangkat TV, tetapi menggunakan fitur tersebut di perangkat non-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"/>

Catatan: Beberapa fitur memiliki subfitur, seperti android.hardware.camera.front, seperti dijelaskan dalam Referensi fitur. Pastikan untuk menandai subfitur yang juga digunakan dalam aplikasi Anda sebagai required="false".

Semua aplikasi yang ditujukan untuk digunakan di perangkat TV harus mendeklarasikan bahwa fitur layar sentuh tidak diperlukan, seperti yang dijelaskan dalam Mulai menggunakan aplikasi TV. Jika aplikasi Anda biasanya menggunakan satu atau beberapa fitur yang tidak didukung oleh perangkat TV, ubah setelan atribut android:required ke false untuk fitur tersebut dalam manifes Anda.

Perhatian: Mendeklarasikan fitur hardware yang diperlukan dengan menetapkan nilainya ke true akan mencegah aplikasi Anda diinstal di perangkat TV atau muncul dalam peluncur layar utama Android TV.

Perhatikan izin yang menyiratkan fitur hardware

Beberapa deklarasi manifes uses-permission mengimplikasikan fitur hardware. Perilaku ini berarti bahwa meminta sebagian izin dalam manifes aplikasi dapat mengecualikan aplikasi agar tidak diinstal dan digunakan di perangkat TV. Izin yang sering diminta berikut ini membuat persyaratan fitur hardware implisit:

Izin Fitur hardware yang diimplikasikan
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera dan
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (khusus API level target 20 atau lebih rendah)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (khusus API level target 20 atau lebih rendah)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

Beberapa perangkat TV hanya memiliki koneksi ethernet.

Untuk mengetahui daftar lengkap permintaan izin yang menyiratkan persyaratan fitur hardware, lihat panduan uses-feature. Jika aplikasi Anda meminta salah satu fitur yang tercantum sebelumnya, sertakan deklarasi uses-feature dalam manifes untuk fitur hardware tersirat yang menunjukkan bahwa fitur tersebut tidak diperlukan. android:required="false".

Catatan: Jika aplikasi Anda menargetkan Android 5.0 (API level 21) atau yang lebih tinggi dan menggunakan izin ACCESS_COARSE_LOCATION atau ACCESS_FINE_LOCATION, pengguna masih dapat menginstal aplikasi Anda di perangkat TV, meskipun perangkat TV tidak memiliki kartu jaringan atau penerima GPS.

Setelah menjadikan fitur hardware opsional untuk aplikasi Anda, Anda harus memeriksa ketersediaan fitur-fitur tersebut saat runtime, lalu menyesuaikan perilaku aplikasi Anda. Bagian selanjutnya membahas cara memeriksa fitur hardware dan menyarankan beberapa pendekatan untuk mengubah perilaku aplikasi Anda.

Untuk mengetahui informasi selengkapnya mengenai memfilter dan mendeklarasikan fitur dalam manifes, lihat panduan uses-feature.

Memeriksa fitur hardware

Framework Android dapat memberi tahu Anda jika fitur hardware tidak tersedia di perangkat tempat aplikasi Anda berjalan. Gunakan metode hasSystemFeature(String) untuk memeriksa fitur tertentu pada runtime. Metode ini mengambil argumen string tunggal yang menentukan fitur yang ingin Anda periksa.

Contoh kode berikut menunjukkan cara mendeteksi ketersediaan fitur hardware pada runtime:

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

Layar sentuh

Sebagian besar TV tidak memiliki layar sentuh, sehingga Android tidak mendukung interaksi layar sentuh untuk perangkat TV. Selain itu, penggunaan layar sentuh tidak konsisten dengan lingkungan menonton di mana pengguna duduk 3 meter dari layar. Pastikan elemen UI dan teks Anda tidak memerlukan atau menyiratkan penggunaan layar sentuh.

Untuk perangkat TV, desain aplikasi Anda untuk mendukung navigasi menggunakan tombol arah (D-pad) pada remote control TV. Untuk informasi selengkapnya tentang mendukung navigasi dengan benar menggunakan kontrol yang sesuai untuk TV, lihat Navigasi TV.

Kamera

Meskipun TV biasanya tidak memiliki kamera, Anda masih dapat menyediakan aplikasi terkait fotografi di TV. Misalnya, jika Anda memiliki aplikasi yang mengambil, melihat, dan mengedit foto, Anda dapat menonaktifkan fungsionalitas pengambilan gambarnya untuk TV dan tetap mengizinkan pengguna melihat dan bahkan mengedit foto. Jika memutuskan untuk mengaktifkan aplikasi terkait kamera agar berfungsi di TV, tambahkan deklarasi fitur berikut pada manifes aplikasi Anda:

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

Jika Anda mengaktifkan aplikasi agar berjalan tanpa kamera, tambahkan kode ke aplikasi yang mendeteksi apakah fitur kamera tersedia dan melakukan penyesuaian pada pengoperasian aplikasi. Contoh kode berikut menunjukkan cara mendeteksi kehadiran kamera:

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 adalah perangkat dalam ruangan yang tidak bergerak dan tidak memiliki penerima sistem pemosisi global (GPS) bawaan. Jika aplikasi Anda menggunakan informasi lokasi, Anda masih dapat mengizinkan pengguna menelusuri lokasi atau menggunakan penyedia lokasi statis seperti kode pos yang dikonfigurasi selama penyiapan perangkat 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);
}

Jeda pemutaran dalam mode daya rendah

Beberapa perangkat TV mendukung mode daya rendah ketika pengguna mematikan perangkat. Perangkat akan menonaktifkan layar dan membiarkan Android TV berjalan di latar belakang, bukan dimatikan. Output audio masih diaktifkan dalam mode ini, jadi hentikan semua konten yang sedang diputar saat perangkat dalam mode daya rendah.

Untuk menghindari pemutaran dalam mode daya rendah, ganti onStop() dan hentikan semua konten yang sedang diputar:

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

Saat pengguna mengaktifkan kembali perangkat, onStart() akan dipanggil jika aplikasi Anda adalah aplikasi latar depan yang aktif. Untuk mengetahui informasi selengkapnya tentang memulai dan menghentikan aktivitas, lihat Siklus proses aktivitas.