टीवी इनपुट सेवा डेवलप करें

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

TIF कंपैनियन लाइब्रेरी का इस्तेमाल करके टीवी इनपुट सेवा बनाना

TIF कंपैनियन लाइब्रेरी एक ऐसा फ़्रेमवर्क है जो एक्सटेंसिबल उपलब्ध कराता है टीवी इनपुट सेवा की सामान्य सुविधाओं का काम करने का तरीका. इसका इस्तेमाल OEM, चैनल, सिर्फ़ Android 5.0 (एपीआई लेवल 21) से Android 7.1 (एपीआई लेवल 25) तक के वर्शन के लिए हैं.

अपना प्रोजेक्ट अपडेट करना

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

मेनिफ़ेस्ट में अपनी टीवी इनपुट सेवा की जानकारी दें

आपके ऐप्लिकेशन में TvInputService के साथ काम करने वाला वर्शन होना चाहिए वह सेवा जिसका इस्तेमाल सिस्टम आपके ऐप्लिकेशन को ऐक्सेस करने के लिए करता है. टीआईएफ़ कंपैनियन लाइब्रेरी में BaseTvInputService क्लास मौजूद होती है, जो इससे TvInputService को डिफ़ॉल्ट तौर पर लागू किया जाता है जिसे कस्टमाइज़ किया जा सकता है. BaseTvInputService की एक सब-क्लास बनाएं, और अपने मेनिफ़ेस्ट में सब-क्लास को सेवा के तौर पर एलान करें.

मेनिफ़ेस्ट फ़ाइल में, BIND_TV_INPUT की अनुमति, टीवी इनपुट को सिस्टम से कनेक्ट करने की सेवा. सिस्टम सेवा बाइंडिंग करता है और इसमें BIND_TV_INPUT की अनुमति. सिस्टम टीवी ऐप्लिकेशन, टीवी इनपुट सेवाओं को अनुरोध भेजता है TvInputManager इंटरफ़ेस के ज़रिए

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

<service android:name=".rich.RichTvInputService"
    android:label="@string/rich_input_label"
    android:permission="android.permission.BIND_TV_INPUT">
    <!-- Required filter used by the system to launch our account service. -->
    <intent-filter>
        <action android:name="android.media.tv.TvInputService" />
    </intent-filter>
    <!-- An XML file which describes this input. This provides pointers to
    the RichTvInputSetupActivity to the system/TV app. -->
    <meta-data
        android:name="android.media.tv.input"
        android:resource="@xml/richtvinputservice" />
</service>

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

सेवा मेटाडेटा फ़ाइल, एक्सएमएल रिसॉर्स डायरेक्ट्री में मौजूद है के लिए डाउनलोड किया गया है और यह उस संसाधन के नाम से मेल खाना चाहिए जिसका एलान आपने मेनिफ़ेस्ट. पिछले उदाहरण की मेनिफ़ेस्ट एंट्री का इस्तेमाल करके, आपको res/xml/richtvinputservice.xml पर एक्सएमएल फ़ाइल बनाएं, जिसमें नीचे दिया गया कॉन्टेंट:

<?xml version="1.0" encoding="utf-8"?>
<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
  android:canRecord="true"
  android:setupActivity="com.example.android.sampletvinput.rich.RichTvInputSetupActivity" />

चैनल तय करें और अपनी सेटअप गतिविधि बनाएं

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

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

<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED "/>

यह एलिमेंट जोड़ें, ताकि आपका ऐप्लिकेशन इस Android TV में कॉन्टेंट चैनल उपलब्ध कराने वाले ऐप्लिकेशन के तौर पर Google Play Store:

<uses-feature
    android:name="android.software.live_tv"
    android:required="true" />

इसके बाद, एक ऐसी क्लास बनाएं जो EpgSyncJobService का विस्तार करती हो क्लास. इस ऐब्सट्रैक्ट क्लास की मदद से, ऐसी नौकरी आसानी से पाई जा सकती है सिस्टम डेटाबेस में चैनल बनाता और अपडेट करता है.

अपनी सब-क्लास में, चैनलों की पूरी सूची बनाएं और getChannels(). अगर आपके चैनल किसी XMLTV फ़ाइल से आते हैं, XmlTvParser क्लास का इस्तेमाल करते हैं. अगर ऐसा नहीं है, तो चैनलों को प्रोग्राम के हिसाब से, Channel.Builder क्लास का इस्तेमाल करके प्रोग्राम के हिसाब से व्यवस्थित करता है.

हर चैनल के लिए, सिस्टम getProgramsForChannel() को कॉल करता है जब उसे प्रोग्राम की ऐसी सूची की ज़रूरत हो जिसे किसी दी गई समय विंडो में देखा जा सके करते हैं. इस वैल्यू के लिए Program ऑब्जेक्ट की सूची दिखाएं चैनल. किसी साइट से प्रोग्राम पाने के लिए, XmlTvParser क्लास का इस्तेमाल करें XMLTV फ़ाइल को कॉपी कर सकते हैं या Program.Builder क्लास.

हर Program ऑब्जेक्ट के लिए, InternalProviderData ऑब्जेक्ट, प्रोग्राम की जानकारी सेट करने के लिए इस तरह से है प्रोग्राम का वीडियो टाइप. अगर आपके पास सीमित संख्या में प्रोग्राम हैं, तो चैनल को लूप में दोहराना चाहते हैं, तो InternalProviderData.setRepeatable() तरीका जिसके मान की वैल्यू हो true.

जॉब सेवा लागू करने के बाद, उसे अपने ऐप्लिकेशन मेनिफ़ेस्ट में जोड़ें:

<service
    android:name=".sync.SampleJobService"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:exported="true" />

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

Kotlin

val inputId = getActivity().intent.getStringExtra(TvInputInfo.EXTRA_INPUT_ID)
EpgSyncJobService.cancelAllSyncRequests(getActivity())
EpgSyncJobService.requestImmediateSync(
        getActivity(),
        inputId,
        ComponentName(getActivity(), SampleJobService::class.java)
)

Java

String inputId = getActivity().getIntent().getStringExtra(TvInputInfo.EXTRA_INPUT_ID);
EpgSyncJobService.cancelAllSyncRequests(getActivity());
EpgSyncJobService.requestImmediateSync(getActivity(), inputId,
        new ComponentName(getActivity(), SampleJobService.class));

सिंक करने के लिए, requestImmediateSync() तरीके का इस्तेमाल करें नौकरी सेवा. उपयोगकर्ता को सिंक पूरा होने का इंतज़ार करना होगा. इसलिए, आपको ऐसा करना चाहिए आपके अनुरोध की अवधि अन्य चीज़ों के मुकाबले कम होती है.

नौकरी की सेवा पाने के लिए, setUpPeriodicSync() तरीका इस्तेमाल करें चैनल और प्रोग्राम डेटा को समय-समय पर बैकग्राउंड में सिंक करते रहें:

Kotlin

EpgSyncJobService.setUpPeriodicSync(
        context,
        inputId,
        ComponentName(context, SampleJobService::class.java)
)

Java

EpgSyncJobService.setUpPeriodicSync(context, inputId,
        new ComponentName(context, SampleJobService.class));

TIF कंपैनियन लाइब्रेरी, एक अतिरिक्त ओवरलोडेड तरीका उपलब्ध कराती है requestImmediateSync(), जिससे आपको अवधि तय करने की सुविधा मिलती है चैनल डेटा को मिलीसेकंड में सिंक करना है. डिफ़ॉल्ट तरीका एक घंटे के और चैनल डेटा को सुरक्षित रखना.

TIF कंपैनियन लाइब्रेरी में ओवरलोडेड setUpPeriodicSync(), जिससे आपको अवधि तय करने की सुविधा मिलती है चैनल डेटा सिंक करना है और समय-समय पर सिंक कितनी बार होना चाहिए. कॉन्टेंट बनाने डिफ़ॉल्ट तरीका, हर 12 घंटे में 48 घंटे चैनल का डेटा सिंक करता है.

चैनल के डेटा और ईपीजी के बारे में ज़्यादा जानने के लिए, यहां जाएं चैनल के डेटा का इस्तेमाल करें.

ट्यूनिंग के अनुरोध और मीडिया प्लेबैक मैनेज करना

जब कोई उपयोगकर्ता किसी चैनल को चुनता है, तो सिस्टम टीवी ऐप्लिकेशन अनुरोध किए गए चैनल को ट्यून करने के लिए, आपके ऐप्लिकेशन में बनाया गया Session और वीडियो चलाना. TIF कंपैनियन लाइब्रेरी में आपको कई क्लास का इस्तेमाल करें जिन्हें सिस्टम से चैनल और सेशन कॉल को मैनेज करने के लिए बढ़ाया जा सकता है.

आपकी BaseTvInputService सब-क्लास ऐसे सेशन बनाती है जो ट्यूनिंग के अनुरोध. onCreateSession() तरीका, इससे बढ़ाया गया सेशन बनाएं BaseTvInputService.Session क्लास और कॉल आपके नए सेशन के साथ super.sessionCreated(). निम्न में जैसे, onCreateSession() नतीजे के तौर पर RichTvInputSessionImpl ऑब्जेक्ट जो एक्सटेंडेट होता है BaseTvInputService.Session:

Kotlin

override fun onCreateSession(inputId: String): Session =
        RichTvInputSessionImpl(this, inputId).apply {
            setOverlayViewEnabled(true)
        }

Java

@Override
public final Session onCreateSession(String inputId) {
    RichTvInputSessionImpl session = new RichTvInputSessionImpl(this, inputId);
    session.setOverlayViewEnabled(true);
    return session;
}

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

इसके बाद सिस्टम, शेड्यूल किए गए मौजूदा प्रोग्राम को हासिल करता है और आपके सेशन का onPlayProgram() तरीका, जिसमें प्रोग्राम के बारे में बताया गया है और शुरुआत का समय मिलीसेकंड में. इसका इस्तेमाल करें प्रोग्राम चलाने के लिए TvPlayer इंटरफ़ेस.

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

अपने सत्र की getTvPlayer() विधि में, वापस लौटें आपका मीडिया प्लेयर जो TvPlayer को लागू करता है. कॉन्टेंट बनाने टीवी इनपुट सेवा नमूना ऐप्लिकेशन एक मीडिया प्लेयर लागू करता है, जो ExoPlayer.

टीवी इनपुट फ़्रेमवर्क का इस्तेमाल करके टीवी इनपुट सेवा बनाएं

अगर टीवी इनपुट सेवा, TIF कंपैनियन लाइब्रेरी का इस्तेमाल नहीं कर सकती है, तो आपको इन चीज़ों की ज़रूरत होगी इन्हें लागू करने के लिए:

  • TvInputService, लंबे समय तक चलने वाली और बैकग्राउंड में उपलब्धता की जानकारी देता है टीवी का इनपुट
  • TvInputService.Session टीवी इनपुट की स्थिति को बनाए रखता है और एक-दूसरे से संपर्क करता है होस्टिंग ऐप्लिकेशन के साथ
  • TvContract, टीवी पर उपलब्ध चैनलों और प्रोग्राम की जानकारी देता है इनपुट
  • TvContract.Channels से टीवी चैनल के बारे में जानकारी मिलती है
  • TvContract.Programs, प्रोग्राम जैसे डेटा वाले टीवी प्रोग्राम के बारे में बताता है टाइटल और शुरुआत का समय
  • TvTrackInfo से ऑडियो, वीडियो या सबटाइटल ट्रैक के बारे में पता चलता है
  • TvContentRating से कॉन्टेंट रेटिंग की जानकारी मिलती है. यह ऐप्लिकेशन में अपनी पसंद के मुताबिक कॉन्टेंट दिखाने की अनुमति देता है रेटिंग स्कीम
  • TvInputManager, सिस्टम टीवी ऐप्लिकेशन के लिए एपीआई उपलब्ध कराता है और उसे मैनेज करता है टीवी इनपुट और ऐप्लिकेशन के साथ इंटरैक्शन

आपको ये काम भी करने होंगे:

  1. मेनिफ़ेस्ट में अपनी टीवी इनपुट सेवा का एलान करें, जैसे कि में अपनी टीवी इनपुट सेवा का एलान करें मेनिफ़ेस्ट.
  2. सेवा मेटाडेटा फ़ाइल बनाएं.
  3. अपने चैनल और कार्यक्रम की जानकारी बनाएं और उसे रजिस्टर करें.
  4. अपनी सेटअप गतिविधि बनाएं.

अपनी टीवी इनपुट सेवा तय करें

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

onCreate() तरीका शुरू होकर, HandlerThread, जो यूज़र इंटरफ़ेस (यूआई) थ्रेड से अलग प्रोसेस थ्रेड उपलब्ध कराता है, ताकि सिस्टम से होने वाली कार्रवाइयों को हैंडल कर पाएगा. नीचे दिए गए उदाहरण में, onCreate() तरीका CaptioningManager को शुरू करता है और ACTION_BLOCKED_RATINGS_CHANGED और ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED कार्रवाइयां. ये कार्रवाइयों से यह पता चलता है कि उपयोगकर्ता जब माता-पिता के कंट्रोल की सेटिंग में बदलाव करता है और जब उपयोगकर्ता किसी खास रूटीन से जुड़ी कार्रवाई करता है, तो ब्लॉक की गई रेटिंग की सूची में एक बदलाव हुआ है.

Kotlin

override fun onCreate() {
    super.onCreate()
    handlerThread = HandlerThread(javaClass.simpleName).apply {
        start()
    }
    dbHandler = Handler(handlerThread.looper)
    handler = Handler()
    captioningManager = getSystemService(Context.CAPTIONING_SERVICE) as CaptioningManager

    setTheme(android.R.style.Theme_Holo_Light_NoActionBar)

    sessions = mutableListOf<BaseTvInputSessionImpl>()
    val intentFilter = IntentFilter().apply {
        addAction(TvInputManager.ACTION_BLOCKED_RATINGS_CHANGED)
        addAction(TvInputManager.ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED)
    }
    registerReceiver(broadcastReceiver, intentFilter)
}

Java

@Override
public void onCreate() {
    super.onCreate();
    handlerThread = new HandlerThread(getClass()
      .getSimpleName());
    handlerThread.start();
    dbHandler = new Handler(handlerThread.getLooper());
    handler = new Handler();
    captioningManager = (CaptioningManager)
      getSystemService(Context.CAPTIONING_SERVICE);

    setTheme(android.R.style.Theme_Holo_Light_NoActionBar);

    sessions = new ArrayList<BaseTvInputSessionImpl>();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(TvInputManager
      .ACTION_BLOCKED_RATINGS_CHANGED);
    intentFilter.addAction(TvInputManager
      .ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED);
    registerReceiver(broadcastReceiver, intentFilter);
}

पहली इमेज.TvइनपुटService लाइफ़साइकल.

देखें ब्लॉक किए गए कॉन्टेंट के साथ काम करने और उसे उपलब्ध कराने के बारे में ज़्यादा जानकारी पाने के लिए, कॉन्टेंट कंट्रोल करना माता-पिता का कंट्रोल. सिस्टम से होने वाली ऐसी कार्रवाइयों के बारे में जानने के लिए TvInputManager पर जाएं हो सकता है कि आप अपनी टीवी इनपुट सेवा को मैनेज करना चाहें.

यह TvInputService, Handler.Callback को लागू करने वाला TvInputService.Session प्लेयर की स्थिति में होने वाले बदलावों को हैंडल करने के लिए. के साथ onSetSurface(), TvInputService.Session, Surface को वीडियो कॉन्टेंट. प्लेयर को प्लैटफ़ॉर्म के साथ इंटिग्रेट करना देखें कृपया देखें.Surface

TvInputService.Session onTune() इवेंट जब उपयोगकर्ता किसी चैनल को चुनता है और सिस्टम टीवी ऐप्लिकेशन को कॉन्टेंट में हुए बदलाव की सूचना देता है और कॉन्टेंट मेटाडेटा. इन notify() तरीकों के बारे में यहां बताया गया है कॉन्टेंट कंट्रोल करें और ट्रैक चुनने का काम मैनेज करें इस ट्रेनिंग के दौरान किया था.

सेटअप की गतिविधि तय करें

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

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

अन्य रेफ़रंस