Hardware TV jauh berbeda dengan perangkat Android lainnya. TV tidak menyertakan beberapa fitur hardware yang ada di perangkat Android lainnya, seperti layar sentuh, kamera, dan penerima GPS. TV juga sepenuhnya bergantung pada perangkat hardware sekunder: agar dapat berinteraksi dengan aplikasi TV, pengguna harus menggunakan remote control atau game pad. (Untuk mempelajari berbagai metode input, lihat Mengelola pengontrol TV.)
Saat Anda membuat aplikasi untuk TV, pertimbangkan dengan cermat batasan dan persyaratan hardware yang beroperasi di hardware TV. Periksa apakah aplikasi Anda berjalan di TV dan tangani fitur hardware yang tidak didukung.
Memeriksa perangkat TV
Jika Anda membuat aplikasi yang beroperasi di perangkat TV dan perangkat lain, Anda mungkin perlu
memeriksa jenis perangkat yang menjalankan aplikasi dan menyesuaikan pengoperasian aplikasi. Misalnya, jika Anda memiliki aplikasi yang dapat dimulai melalui Intent,
periksa properti perangkat untuk menentukan apakah akan memulai aktivitas yang berorientasi TV
atau aktivitas ponsel.
Cara yang direkomendasikan untuk menentukan apakah aplikasi Anda berjalan di perangkat TV adalah 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 fungsi aplikasi, Anda mungkin dapat mengatasi ketidaktersediaan fitur hardware tertentu. Bagian ini membahas fitur hardware yang biasanya tidak tersedia untuk TV, cara mendeteksi fitur hardware yang tidak ada, dan alternatif yang disarankan untuk fitur tersebut.
Fitur hardware TV yang tidak didukung
TV memiliki tujuan yang berbeda dari perangkat lain, sehingga tidak memiliki fitur hardware yang sering dimiliki perangkat Android lainnya. Oleh karena itu, 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, yang tidak sama dengan fitur hardware mikrofon yang dijelaskan di sini. Mikrofon pengontrol didukung sepenuhnya.
Lihat Referensi fitur untuk mengetahui daftar lengkap fitur, subfitur, dan deskriptornya.
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 ada untuk digunakan di TV, tinjau manifes aplikasi Anda 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 menggunakan 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 yang 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 Memulai
aplikasi TV. Jika aplikasi Anda biasanya menggunakan satu atau beberapa fitur yang tidak didukung oleh perangkat TV, ubah
setelan atribut android:required menjadi false untuk fitur tersebut dalam manifes Anda.
Perhatian: Mendeklarasikan fitur hardware sebagaimana diperlukan dengan menetapkan
nilainya ke true akan mencegah aplikasi Anda diinstal di perangkat
TV atau muncul di peluncur layar utama Android TV.
Perhatikan izin yang menyiratkan fitur hardware
Beberapa uses-permission
deklarasi manifes menyiratkan fitur hardware. Perilaku ini berarti bahwa meminta beberapa
izin dalam manifes aplikasi dapat mengecualikan aplikasi Anda agar tidak diinstal dan digunakan di perangkat
TV. Izin yang biasa diminta berikut 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 |
|
ACCESS_FINE_LOCATION |
|
ACCESS_WIFI_STATECHANGE_WIFI_STATE
|
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 membuat fitur hardware opsional untuk aplikasi, Anda harus memeriksa ketersediaan fitur tersebut saat runtime, lalu menyesuaikan perilaku aplikasi. Bagian berikutnya membahas cara memeriksa fitur hardware dan menyarankan beberapa pendekatan untuk mengubah perilaku aplikasi Anda.
Untuk mengetahui informasi selengkapnya tentang cara 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 saat runtime. Metode ini menggunakan argumen string tunggal yang
menentukan fitur yang ingin Anda periksa.
Contoh kode berikut menunjukkan cara mendeteksi ketersediaan fitur hardware saat 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 perangkat TV tidak memiliki kemampuan input layar sentuh atau pointer dan sepenuhnya mengandalkan remote control tombol arah (D-pad) untuk navigasi. Aplikasi TV harus selalu mendukung remote control D-pad.
Untuk informasi selengkapnya tentang cara mendukung navigasi dengan benar menggunakan kontrol yang sesuai untuk TV, lihat Navigasi TV.
Mendeklarasikan dukungan sentuh
Beberapa perangkat TV mendukung remote pointer dan layar sentuh. Aplikasi Anda dapat mendukung interaksi klik, arahkan kursor, dan scroll, seperti di perangkat seluler, untuk memberikan pengalaman yang lebih baik di perangkat yang mendukungnya.
Jika aplikasi Anda mengizinkan mode sentuh, Anda dapat mendeklarasikan dukungan sentuh untuk seluruh aplikasi atau untuk
aktivitas individual dengan menambahkan elemen android.software.leanback.supports_touch
<property> yang ditetapkan ke
true di dalam elemen <application> atau <activity>
di AndroidManifest.xml:
<application ...> <property android:name="android.software.leanback.supports_touch" android:value="true|false" /> ... </application>
Catatan: Di perangkat yang mendukung remote penunjuk (seperti air mouse atau trackpad), mengaktifkan opsi ini
akan mengaktifkan mode kursor dan sentuh, bukan mengandalkan emulasi kompatibilitas platform. Deklarasi
tingkat aktivitas menggantikan deklarasi tingkat aplikasi untuk aktivitas tersebut. Jika properti ini dihilangkan,
nilai defaultnya adalah false.
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 fungsi pengambilan gambar untuk TV dan tetap mengizinkan pengguna melihat dan bahkan mengedit foto. Jika Anda memutuskan untuk mengaktifkan aplikasi terkait kamera agar berfungsi di TV, tambahkan deklarasi fitur berikut ke manifes aplikasi Anda:
<uses-feature android:name="android.hardware.camera" android:required="false" />
Jika Anda mengaktifkan aplikasi untuk berjalan tanpa kamera, tambahkan kode ke aplikasi yang mendeteksi apakah fitur kamera tersedia dan melakukan penyesuaian pada pengoperasian aplikasi Anda. Contoh kode berikut menunjukkan cara mendeteksi keberadaan 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 = locationManager.getLastKnownLocation("static") if (location == null) { Log.e(TAG, "Location is null") return } // 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)?.firstOrNull() ?.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); }
Menjeda pemutaran selama mode hemat daya
Beberapa perangkat TV mendukung mode daya rendah saat pengguna menonaktifkan perangkat. Alih-alih dimatikan, perangkat akan menonaktifkan layar dan membuat Android TV tetap berjalan di latar belakang. Output audio masih diaktifkan dalam mode ini, jadi hentikan konten yang sedang diputar saat perangkat dalam mode hemat daya.
Untuk menghindari pemutaran selama mode hemat daya, ganti
onStop
dan hentikan 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 daya, onStart akan dipanggil
jika aplikasi Anda adalah aplikasi latar depan yang aktif. Untuk informasi selengkapnya tentang memulai dan menghentikan
aktivitas, lihat
Siklus proses aktivitas.