Menangani hardware TV

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

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

Memeriksa perangkat TV

Jika Anda membangun aplikasi yang beroperasi baik pada perangkat TV maupun perangkat lain, Anda mungkin perlu memeriksa jenis perangkat yang akan menjalankan aplikasi Anda dan menyesuaikan pengoperasian aplikasi. Misalnya, jika Anda memiliki aplikasi yang bisa dimulai melalui Intent, aplikasi Anda harus memeriksa properti perangkat untuk menentukan apakah perangkat itu harus memulai aktivitas yang berorientasi TV atau aktivitas telepon.

Cara yang direkomendasikan untuk menentukan apakah aplikasi Anda berjalan di perangkat TV adalah dengan menggunakan metode UiModeManager.getCurrentModeType() untuk memeriksa apakah perangkat berjalan dalam mode televisi. Kode contoh berikut ini menunjukkan cara memeriksa apakah aplikasi Anda berjalan di perangkat TV:

Kotlin

    const val TAG = "DeviceTypeRuntimeCheck"

    val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
    if (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION) {
        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";

    UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);
    if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) {
        Log.d(TAG, "Running on a TV Device");
    } else {
        Log.d(TAG, "Running on a non-TV Device");
    }
    

Menangani fitur hardware yang tidak didukung

Tergantung pada desain dan fungsionalitas aplikasi, Anda mungkin bisa menangani fitur hardware tertentu yang tidak tersedia. Bagian ini membahas tentang fitur hardware yang biasanya tidak tersedia untuk TV, cara mendeteksi fitur hardware yang tidak ditemukan, dan menyarankan alternatif untuk menggunakan fitur-fitur ini.

Fitur hardware TV yang tidak didukung

TV memiliki kegunaan yang berbeda dengan perangkat lainnya, sehingga fitur hardware yang umumnya dimiliki perangkat lain berbasis Android terkadang tidak tersedia di TV. Oleh karena itu, sistem Android ini 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 [1] android.hardware.microphone
Sensor android.hardware.sensor
Layar berorientasi potret android.hardware.screen.portrait

[1] 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 deksriptornya.

Mendeklarasikan persyaratan hardware untuk TV

Aplikasi Android bisa mendeklarasikan persyaratan fitur hardware dalam manifes aplikasi agar tidak diinstal di perangkat yang tidak menyediakan fitur-fitur tersebut. Jika Anda mengembangkan aplikasi yang ada agar bisa 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 perangkat keras (seperti layar sentuh atau kamera) yang tidak tersedia pada TV, tetapi dapat beroperasi tanpa penggunaan fitur-fitur tersebut, ubah manifes aplikasi Anda untuk menunjukkan bahwa fitur-fitur tersebut tidak diperlukan oleh aplikasi. Cuplikan kode manifes berikut memperagakan cara mendeklarasikan bahwa aplikasi Anda tidak memerlukan fitur perangkat keras yang tidak tersedia pada perangkat TV, meskipun aplikasi Anda mungkin menggunakan fitur-fitur ini pada 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"/>
    

Catatan: Beberapa fitur memiliki subfitur misalnya 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 sebagaimana dijelaskan dalam Mulai menggunakan aplikasi TV. Jika aplikasi Anda biasanya menggunakan satu atau beberapa fitur yang tercantum di atas, ganti setelan atribut android:required menjadi 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.

Setelah menentukan agar fitur hardware bersifat opsional bagi aplikasi Anda, periksa ketersediaan fitur-fitur tersebut saat waktu proses dan sesuaikan perilaku aplikasi. Bagian berikutnya membahas tentang cara memeriksa fitur hardware serta menyarankan beberapa pendekatan untuk mengubah perilaku aplikasi Anda.

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

Mendeklarasikan izin yang mengimplikasikan fitur hardware

Sebagian deklarasi manifes uses-permission mengimplikasikan fitur hardware. Perilaku ini berarti bahwa meminta sebagian izin dalam manifes aplikasi bisa mengecualikan aplikasi sehingga tidak diinstal dan digunakan di perangkat TV. Izin yang sering diminta berikut ini membuat syarat fitur hardware yang 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 (Hanya API target level 20 atau lebih rendah.)

ACCESS_FINE_LOCATION

android.hardware.location

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

Untuk daftar lengkap mengenai permintaan izin yang mengimplikasikan persyaratan fitur hardware, lihat panduan uses-feature. Jika aplikasi Anda meminta salah satu fitur yang tercantum di atas, sertakan deklarasi uses-feature dalam manifes Anda untuk fitur perangkat keras yang diimplikasikan yang menunjukkan bahwa fitur itu tidak diperlukan (android:required="false").

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

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 spesifik pada waktu proses. Metode ini mengambil argumen string tunggal yang menentukan fitur mana yang ingin Anda periksa.

Contoh kode berikut ini mendemonstrasikan cara mendeteksi ketersediaan fitur hardware pada waktu proses:

Kotlin

    // Check if the telephony hardware feature is available.
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
        Log.d("HardwareFeatureTest", "Device can make phone calls")
    }

    // Check if android.hardware.touchscreen feature is available.
    if (packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
        Log.d("HardwareFeatureTest", "Device has a touch screen.")
    }
    

Java

    // Check if the telephony hardware feature is available.
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
        Log.d("HardwareFeatureTest", "Device can make phone calls");
    }

    // Check if android.hardware.touchscreen feature is available.
    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
        Log.d("HardwareFeatureTest", "Device has a touch screen.");
    }
    

Layar sentuh

Sebagian besar TV tidak memiliki layar sentuh sehingga Android tidak mendukung interaksi layar sentuh untuk perangkat TV. Selain itu, penggunaan layar sentuh juga tidak sesuai dengan lingkungan menonton yang mengharuskan pengguna duduk sejauh 3 meter dari layar. Pastikan elemen UI dan teks Anda tidak mengharuskan atau mengimplikasikan penggunaan layar sentuh.

Pada perangkat TV, aplikasi harus dirancang agar berfungsi dengan model interaksi ini dengan 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 Membuat navigasi TV.

Kamera

Meskipun TV biasanya tidak memiliki kamera, Anda masih bisa 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 ini pada manifes aplikasi:

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

Jika Anda mengaktifkan aplikasi untuk berjalan tanpa kamera, tambahkan kode ke aplikasi yang akan mendeteksi apakah fitur kamera tersedia dan membuat penyesuaian pada pengoperasian aplikasi Anda. Contoh kode berikut memperagakan cara mendeteksi keberadaan kamera:

Kotlin

    // Check if 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 if 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 portabel dan tidak memiliki penerima sistem pemosisi global (GPS) built-in. Jika aplikasi Anda menggunakan informasi lokasi, Anda masih bisa memungkinkan pengguna untuk mencari lokasi, atau menggunakan penyedia lokasi statis seperti kode pos yang telah dikonfigurasi saat menyiapkan 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 or zip 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 or zip 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("Zip code", address.getPostalCode());

    } catch (IOException e) {
      Log.e(TAG, "Geocoder error", e);
    }
    

Menjeda pemutaran dalam mode daya rendah

Beberapa perangkat TV mendukung mode daya rendah ketika pengguna mematikan perangkat. Saat dimatikan, perangkat hanya akan menonaktifkan layar dan membiarkan Android TV berjalan di latar belakang. Output audio masih diaktifkan dalam mode ini sehingga aplikasi Anda harus menghentikan konten apa pun yang sedang diputar saat perangkat dalam mode daya rendah.

Untuk menghindari pemutaran dalam mode daya rendah, batalkan 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, jika aplikasi Anda adalah aplikasi latar depan yang aktif, onStart() akan dipanggil. Untuk mengetahui informasi selengkapnya tentang memulai dan menghentikan aktivitas, lihat Siklus proses aktivitas.