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

टीवी का हार्डवेयर, अन्य 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 पर सेट करने से, आपका ऐप्लिकेशन टीवी डिवाइसों पर इंस्टॉल नहीं हो पाएगा. साथ ही, वह 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 = 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);
}

बैटरी बचाने वाले मोड में, प्लेबैक को रोकना

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