टीवी हार्डवेयर हैंडल करना

टीवी का हार्डवेयर, अन्य Android डिवाइसों से काफ़ी अलग होता है. टीवी में, Android के अन्य डिवाइसों पर मौजूद कुछ हार्डवेयर सुविधाएं नहीं होती हैं. जैसे, टचस्क्रीन, कैमरे, और जीपीएस रिसीवर. टीवी पूरी तरह से सेकंडरी हार्डवेयर डिवाइसों पर भी निर्भर होते हैं: टीवी ऐप्लिकेशन के साथ इंटरैक्ट करने के लिए, लोगों को रिमोट कंट्रोल या गेम पैड का इस्तेमाल करना होगा. (इनपुट के अलग-अलग तरीकों के बारे में जानने के लिए, टीवी कंट्रोलर मैनेज करना लेख पढ़ें.)

टीवी के लिए ऐप्लिकेशन बनाते समय, टीवी के हार्डवेयर से जुड़ी सीमाओं और ज़रूरी शर्तों के बारे में ध्यान से सोचें. देखें कि आपका ऐप्लिकेशन टीवी पर चल रहा है या नहीं. साथ ही, हार्डवेयर की उन सुविधाओं को मैनेज करें जो काम नहीं करती हैं.

टीवी डिवाइस का पता लगाना

अगर आपको ऐसा ऐप्लिकेशन बनाना है जो टीवी डिवाइसों और अन्य डिवाइसों, दोनों पर काम करता है, तो आपको यह देखना होगा कि आपका ऐप्लिकेशन किस तरह के डिवाइस पर चल रहा है. इसके बाद, आपको अपने ऐप्लिकेशन के काम करने के तरीके में बदलाव करना होगा. उदाहरण के लिए, अगर आपके पास ऐसा ऐप्लिकेशन है जिसे 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
नियर फ़ील्ड कम्यूनिकेशन (एनएफ़सी) android.hardware.nfc
जीपीएस android.hardware.location.gps
माइक्रोफ़ोन android.hardware.microphone
सेंसर android.hardware.sensor
पोर्ट्रेट ओरिएंटेशन में स्क्रीन android.hardware.screen.portrait

ध्यान दें: कुछ टीवी कंट्रोलर में माइक्रोफ़ोन होता है. हालांकि, यह माइक्रोफ़ोन हार्डवेयर की उस सुविधा से अलग होता है जिसके बारे में यहां बताया गया है. कंट्रोलर के माइक्रोफ़ोन का इस्तेमाल किया जा सकता है.

सुविधाओं, उप-सुविधाओं, और उनके ब्यौरे की पूरी सूची देखने के लिए, सुविधाओं का रेफ़रंस देखें.

टीवी के लिए हार्डवेयर से जुड़ी ज़रूरी शर्तों के बारे में जानकारी देना

Android ऐप्लिकेशन, ऐप्लिकेशन मेनिफ़ेस्ट में हार्डवेयर की सुविधाओं से जुड़ी ज़रूरी शर्तों के बारे में बता सकते हैं. इससे यह पक्का करने में मदद मिलती है कि उन्हें ऐसे डिवाइसों पर इंस्टॉल न किया जाए जिनमें वे सुविधाएं उपलब्ध नहीं हैं. अगर आपको टीवी पर इस्तेमाल करने के लिए किसी मौजूदा ऐप्लिकेशन को बढ़ाना है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट की अच्छी तरह से समीक्षा करें. देखें कि कहीं हार्डवेयर से जुड़ी कोई ऐसी ज़रूरी शर्त तो नहीं बताई गई है जिसकी वजह से, ऐप्लिकेशन को टीवी डिवाइस पर इंस्टॉल नहीं किया जा सकता.

अगर आपका ऐप्लिकेशन, टचस्क्रीन या कैमरे जैसी हार्डवेयर सुविधाओं का इस्तेमाल करता है, जो टीवी पर उपलब्ध नहीं हैं, लेकिन वह उन सुविधाओं के बिना काम कर सकता है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट में बदलाव करें. इससे यह पता चलता है कि इन सुविधाओं की ज़रूरत नहीं है. मेनिफ़ेस्ट के इस कोड स्निपेट में बताया गया है कि यह कैसे एलान किया जाए कि आपके ऐप्लिकेशन को ऐसी हार्डवेयर सुविधाओं की ज़रूरत नहीं है जो टीवी डिवाइसों पर उपलब्ध नहीं हैं. हालांकि, यह ऐप्लिकेशन उन सुविधाओं का इस्तेमाल, टीवी के अलावा अन्य डिवाइसों पर करता है:

<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" के तौर पर मार्क करना न भूलें.

टीवी डिवाइसों पर इस्तेमाल किए जाने वाले सभी ऐप्लिकेशन को यह एलान करना होगा कि टचस्क्रीन की सुविधा ज़रूरी नहीं है. इसके बारे में टीवी ऐप्लिकेशन का इस्तेमाल शुरू करने का तरीका लेख में बताया गया है. अगर आपका ऐप्लिकेशन आम तौर पर ऐसी एक या उससे ज़्यादा सुविधाओं का इस्तेमाल करता है जो टीवी डिवाइसों पर काम नहीं करती हैं, तो अपने मेनिफ़ेस्ट में उन सुविधाओं के लिए, android:required एट्रिब्यूट की सेटिंग को false पर सेट करें.

चेतावनी: किसी हार्डवेयर सुविधा को ज़रूरी के तौर पर सेट करने के लिए, उसकी वैल्यू को true पर सेट करें. ऐसा करने से, आपका ऐप्लिकेशन TV डिवाइसों पर इंस्टॉल नहीं किया जा सकेगा. साथ ही, वह Android TV की होम स्क्रीन लॉन्चर में भी नहीं दिखेगा.

हार्डवेयर की सुविधाओं के लिए ज़रूरी अनुमतियों के बारे में जानकारी

कुछ uses-permission मेनिफ़ेस्ट में किए गए एलानों से हार्डवेयर की सुविधाओं के बारे में पता चलता है. इसका मतलब है कि ऐप्लिकेशन मेनिफ़ेस्ट में कुछ अनुमतियों का अनुरोध करने से, आपके ऐप्लिकेशन को टीवी डिवाइसों पर इंस्टॉल और इस्तेमाल करने से रोका जा सकता है. आम तौर पर, इन अनुमतियों का अनुरोध किया जाता है. इनसे हार्डवेयर की सुविधा से जुड़ी ज़रूरी शर्तें अपने-आप लागू हो जाती हैं:

अनुमति हार्डवेयर की सुविधा के बारे में जानकारी
RECORD_AUDIO android.hardware.microphone
CAMERA android.hardware.camera और
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATION

android.hardware.location

android.hardware.location.network (सिर्फ़ टारगेट एपीआई लेवल 20 या इससे पहले के लेवल के लिए)

ACCESS_FINE_LOCATION

android.hardware.location

android.hardware.location.gps (सिर्फ़ टारगेट एपीआई लेवल 20 या इससे पहले के लेवल के लिए)

ACCESS_WIFI_STATE
CHANGE_WIFI_STATE

android.hardware.wifi

कुछ टीवी डिवाइसों में सिर्फ़ इथरनेट कनेक्शन होता है.

हार्डवेयर की सुविधा से जुड़ी ज़रूरी शर्तों के लिए, अनुमति के अनुरोधों की पूरी सूची देखने के लिए, uses-feature गाइड देखें. अगर आपका ऐप्लिकेशन, पहले बताई गई किसी सुविधा का अनुरोध करता है, तो अपने मेनिफ़ेस्ट में uses-feature एलान शामिल करें. इससे यह पता चलेगा कि हार्डवेयर की उस सुविधा की ज़रूरत नहीं है. android:required="false".

ध्यान दें: अगर आपका ऐप्लिकेशन, Android 5.0 (एपीआई लेवल 21) या उसके बाद वाले वर्शन को टारगेट करता है और ACCESS_COARSE_LOCATION या ACCESS_FINE_LOCATION अनुमति का इस्तेमाल करता है, तो उपयोगकर्ता अब भी आपके ऐप्लिकेशन को टीवी डिवाइस पर इंस्टॉल कर सकते हैं. भले ही, टीवी डिवाइस में नेटवर्क कार्ड या जीपीएस रिसीवर न हो.

अपने ऐप्लिकेशन के लिए हार्डवेयर की सुविधाओं को वैकल्पिक बनाने के बाद, आपको यह देखना होगा कि रनटाइम के दौरान ये सुविधाएं उपलब्ध हैं या नहीं. इसके बाद, अपने ऐप्लिकेशन के व्यवहार में बदलाव करें. अगले सेक्शन में, हार्डवेयर की सुविधाओं की जांच करने का तरीका बताया गया है. साथ ही, आपके ऐप्लिकेशन के व्यवहार में बदलाव करने के कुछ तरीके सुझाए गए हैं.

मेनिफ़ेस्ट में फ़िल्टर करने और सुविधाओं के बारे में बताने से जुड़ी ज़्यादा जानकारी के लिए, 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.");
}

टचस्क्रीन

ज़्यादातर टीवी डिवाइसों में टचस्क्रीन या पॉइंटर इनपुट की सुविधा नहीं होती. ये डिवाइस, नेविगेशन के लिए पूरी तरह से डायरेक्शनल पैड (डी-पैड) वाले रिमोट कंट्रोल पर निर्भर होते हैं. टीवी ऐप्लिकेशन में, डी-पैड वाले रिमोट कंट्रोल की सुविधा हमेशा काम करनी चाहिए.

टीवी के रिमोट से नेविगेशन की सुविधा को सही तरीके से इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, टीवी नेविगेशन लेख पढ़ें.

टच सपोर्ट की सुविधा के बारे में जानकारी देना

कुछ टीवी डिवाइसों पर, पॉइंटर रिमोट और टचस्क्रीन डिसप्ले काम करते हैं. आपका ऐप्लिकेशन, क्लिक, होवर, और स्क्रोल इंटरैक्शन के साथ काम कर सकता है. जैसे, मोबाइल डिवाइस पर काम करता है. इससे, उन डिवाइसों पर बेहतर अनुभव मिलता है जिन पर ये इंटरैक्शन काम करते हैं.

अगर आपके ऐप्लिकेशन में टच मोड की सुविधा है, तो AndroidManifest.xml में android.software.leanback.supports_touch को true के तौर पर सेट करके, टच मोड की सुविधा के बारे में बताया जा सकता है:

<meta-data android:name="android.software.leanback.supports_touch" android:value="true|false"/>

ध्यान दें: पॉइंटिंग रिमोट (जैसे, एयर माउस या ट्रैकपैड) के साथ काम करने वाले डिवाइसों पर, इस सुविधा को चालू करने से कर्सर और टच मोड चालू हो जाता है. इसके लिए, प्लैटफ़ॉर्म के साथ काम करने वाले इम्यूलेशन पर भरोसा करने की ज़रूरत नहीं होती. इस मेटाडेटा को शामिल न करने पर, डिफ़ॉल्ट रूप से false दिखता है.

कैमरा

आम तौर पर, टीवी में कैमरा नहीं होता. हालाँकि, टीवी पर फ़ोटोग्राफ़ी से जुड़ा ऐप्लिकेशन उपलब्ध कराया जा सकता है. उदाहरण के लिए, अगर आपके पास ऐसा ऐप्लिकेशन है जो फ़ोटो लेता है, उन्हें देखता है, और उनमें बदलाव करता है, तो टीवी के लिए फ़ोटो लेने की सुविधा बंद की जा सकती है. हालांकि, उपयोगकर्ताओं को फ़ोटो देखने और उनमें बदलाव करने की सुविधा मिलती रहेगी. अगर आपको कैमरे से जुड़े ऐप्लिकेशन को टीवी पर काम करने की सुविधा चालू करनी है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट में, सुविधा के बारे में यह एलान जोड़ें:

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

जीपीएस

टीवी को एक जगह पर रखा जाता है और ये घर के अंदर इस्तेमाल किए जाने वाले डिवाइस हैं. इनमें बिल्ट-इन ग्लोबल पोज़िशनिंग सिस्टम (जीपीएस) रिसीवर नहीं होते हैं. अगर आपका ऐप्लिकेशन जगह की जानकारी का इस्तेमाल करता है, तो भी उपयोगकर्ताओं को किसी जगह को खोजने या स्टैटिक लोकेशन प्रोवाइडर का इस्तेमाल करने की अनुमति दी जा सकती है. जैसे, टीवी डिवाइस के सेटअप के दौरान कॉन्फ़िगर किया गया पिन कोड.

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() को कॉल किया जाता है. ऐसा तब होता है, जब आपका ऐप्लिकेशन फ़ोरग्राउंड में ऐक्टिव हो. किसी गतिविधि को शुरू और बंद करने के बारे में ज़्यादा जानने के लिए, गतिविधि का लाइफ़साइकल देखें.