अपने कस्टम वेब रिसीवर में मुख्य सुविधाएं जोड़ें

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

  1. यह एक cast-media-player एलिमेंट है. यह Web Receiver के साथ उपलब्ध, बिल्ट-इन प्लेयर यूज़र इंटरफ़ेस (यूआई) को दिखाता है.
  2. cast-media-player एलिमेंट के लिए, सीएसएस जैसी कस्टम स्टाइलिंग. इससे background-image, splash-image, और font-family जैसे अलग-अलग यूज़र इंटरफ़ेस (यूआई) एलिमेंट को स्टाइल किया जा सकता है.
  3. Web Receiver फ़्रेमवर्क को लोड करने के लिए स्क्रिप्ट एलिमेंट.
  4. मैसेज को इंटरसेप्ट करने और इवेंट को हैंडल करने के लिए JavaScript कोड.
  5. ऑटोप्ले के लिए कतार.
  6. वीडियो चलाने की सुविधा को कॉन्फ़िगर करने के विकल्प.
  7. वेब रिसीवर का कॉन्टेक्स्ट सेट करने के विकल्प.
  8. Web Receiver ऐप्लिकेशन के साथ काम करने वाले निर्देश सेट करने के विकल्प.
  9. Web Receiver ऐप्लिकेशन को शुरू करने के लिए JavaScript कॉल.

ऐप्लिकेशन कॉन्फ़िगरेशन और विकल्प

ऐप्लिकेशन को कॉन्फ़िगर करना

CastReceiverContext डेवलपर के लिए सबसे बाहरी क्लास है. यह क्लास, बुनियादी लाइब्रेरी को लोड करने और Web Receiver SDK को शुरू करने की प्रोसेस को मैनेज करती है. एसडीके, ऐसे एपीआई उपलब्ध कराता है जिनकी मदद से ऐप्लिकेशन डेवलपर, CastReceiverOptions के ज़रिए एसडीके को कॉन्फ़िगर कर सकते हैं. इन कॉन्फ़िगरेशन का आकलन, ऐप्लिकेशन लॉन्च होने पर एक बार किया जाता है. साथ ही, इन्हें SDK को तब पास किया जाता है, जब start को कॉल करने के दौरान वैकल्पिक पैरामीटर सेट किया जाता है.

नीचे दिए गए उदाहरण में, यह पता लगाने के लिए डिफ़ॉल्ट व्यवहार को बदलने का तरीका बताया गया है कि क्या भेजने वाले का कनेक्शन अब भी चालू है. जब वेब रिसीवर, maxInactivity सेकंड तक सेंडर से कम्यूनिकेट नहीं कर पाता है, तब SENDER_DISCONNECTED इवेंट भेजा जाता है. नीचे दिया गया कॉन्फ़िगरेशन, इस टाइम आउट को बदल देता है. समस्याओं को डीबग करने के दौरान यह विकल्प काम आ सकता है. ऐसा इसलिए, क्योंकि इससे वेब रिसीवर ऐप्लिकेशन, Chrome रिमोट Debugger सेशन को बंद नहीं करता. ऐसा तब होता है, जब IDLE मोड में कनेक्ट किए गए सेंडर की संख्या शून्य होती है.

const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);

प्लेयर को कॉन्फ़िगर करना

कॉन्टेंट लोड करते समय, Web Receiver SDK टूल, cast.framework.PlaybackConfig का इस्तेमाल करके, प्लेबैक वैरिएबल कॉन्फ़िगर करने का तरीका उपलब्ध कराता है. जैसे, DRM की जानकारी, फिर से कोशिश करने के कॉन्फ़िगरेशन, और अनुरोध हैंडलर. इस जानकारी को PlayerManager मैनेज करता है. साथ ही, इसका आकलन तब किया जाता है, जब प्लेयर बनाए जाते हैं. Web Receiver SDK को हर बार नया लोड पास करने पर, प्लेयर बनाए जाते हैं. खिलाड़ी के बनने के बाद, PlaybackConfig में किए गए बदलावों का आकलन अगले कॉन्टेंट लोड में किया जाता है. एसडीके, PlaybackConfig में बदलाव करने के लिए ये तरीके उपलब्ध कराता है.

  • CastReceiverOptions.playbackConfig का इस्तेमाल करके, CastReceiverContext को शुरू करते समय डिफ़ॉल्ट कॉन्फ़िगरेशन के विकल्पों को बदला जा सकता है.
  • मौजूदा कॉन्फ़िगरेशन पाने के लिए, PlayerManager.getPlaybackConfig() पर क्लिक करें.
  • मौजूदा कॉन्फ़िगरेशन को बदलने के लिए, PlayerManager.setPlaybackConfig() पर क्लिक करें. यह सेटिंग, इसके बाद के सभी लोड पर लागू होती है. ऐसा तब तक होता है, जब तक इसे फिर से बदल नहीं दिया जाता.
  • PlayerManager.setMediaPlaybackInfoHandler() का इस्तेमाल करके, सिर्फ़ उस मीडिया आइटम के लिए अतिरिक्त कॉन्फ़िगरेशन लागू करें जिसे मौजूदा कॉन्फ़िगरेशन के ऊपर लोड किया जा रहा है. हैंडलर को प्लेयर बनाने से ठीक पहले कॉल किया जाता है. यहां किए गए बदलाव हमेशा के लिए नहीं होते. साथ ही, इन्हें getPlaybackConfig() से की गई क्वेरी में शामिल नहीं किया जाता. अगला मीडिया आइटम लोड होने पर, इस हैंडलर को फिर से कॉल किया जाता है.

यहां दिए गए उदाहरण में, CastReceiverContext को शुरू करते समय PlaybackConfig को सेट करने का तरीका बताया गया है. यह कॉन्फ़िगरेशन, मेनिफ़ेस्ट पाने के लिए किए गए आउटगोइंग अनुरोधों को बदल देता है. यह हैंडलर बताता है कि सीओआरएस Access-Control अनुरोध, क्रेडेंशियल का इस्तेमाल करके किए जाने चाहिए. जैसे, कुकी या ऑथराइज़ेशन हेडर.

const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

यहां दिए गए उदाहरण में, PlayerManager में दिए गए getter और setter का इस्तेमाल करके, PlaybackConfig को बदलने का तरीका बताया गया है. यह सेटिंग, प्लेयर को कॉन्फ़िगर करती है, ताकि एक सेगमेंट लोड होने के बाद कॉन्टेंट को फिर से चलाया जा सके.

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
            new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);

यहां दिए गए उदाहरण में, मीडिया चलाने की जानकारी देने वाले हैंडलर का इस्तेमाल करके, किसी लोड अनुरोध के लिए PlaybackConfig को बदलने का तरीका बताया गया है. हैंडलर, ऐप्लिकेशन में लागू किए गए getLicenseUrlForMedia तरीके को कॉल करता है, ताकि मौजूदा आइटम के contentId से licenseUrl मिल सके.

playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
  const mediaInformation = loadRequestData.media;
  playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);

  return playbackConfig;
});

इवेंट लिसनर

Web Receiver SDK की मदद से, Web Receiver ऐप्लिकेशन को प्लेयर इवेंट मैनेज करने की अनुमति मिलती है. इवेंट लिसनर, cast.framework.events.EventType पैरामीटर (या इन पैरामीटर का ऐरे) लेता है. यह पैरामीटर उन इवेंट के बारे में बताता है जिनसे लिसनर को ट्रिगर करना चाहिए. डीबग करने के लिए काम आने वाले, पहले से कॉन्फ़िगर किए गए cast.framework.events.EventType के ऐरे, cast.framework.events.category में देखे जा सकते हैं. इवेंट पैरामीटर, इवेंट के बारे में अतिरिक्त जानकारी देता है.

उदाहरण के लिए, अगर आपको यह जानना है कि mediaStatus में बदलाव कब ब्रॉडकास्ट किया जा रहा है, तो इवेंट को मैनेज करने के लिए इस लॉजिक का इस्तेमाल किया जा सकता है:

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
    cast.framework.events.EventType.MEDIA_STATUS, (event) => {
      // Write your own event handling code, for example
      // using the event.mediaStatus value
});

मैसेज को बीच में ही रोक देना

Web Receiver SDK की मदद से, Web Receiver ऐप्लिकेशन को मैसेज इंटरसेप्ट करने और उन मैसेज पर कस्टम कोड चलाने की अनुमति मिलती है. मैसेज इंटरसेप्टर, cast.framework.messages.MessageType पैरामीटर लेता है. इससे यह तय होता है कि किस तरह के मैसेज को इंटरसेप्ट किया जाना चाहिए.

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

उदाहरण के लिए, अगर आपको लोड करने के अनुरोध के डेटा में बदलाव करना है, तो इसे रोकने और इसमें बदलाव करने के लिए, इस लॉजिक का इस्तेमाल किया जा सकता है:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_FAILED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      if (!loadRequestData.media.entity) {
        return loadRequestData;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          if (!asset) {
            throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
          }

          loadRequestData.media.contentUrl = asset.url;
          loadRequestData.media.metadata = asset.metadata;
          loadRequestData.media.tracks = asset.tracks;
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

context.start();

गड़बड़ी ठीक करना

मैसेज इंटरसेप्टर में गड़बड़ियां होने पर, आपके वेब रिसीवर ऐप्लिकेशन को सही cast.framework.messages.ErrorType और cast.framework.messages.ErrorReason वैल्यू दिखानी चाहिए.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_CANCELLED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      ...

      return fetchAssetAndAuth(loadRequestData.media.entity,
                               loadRequestData.credentials)
        .then(asset => {
          ...
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

मैसेज इंटरसेप्शन बनाम इवेंट लिसनर

मैसेज इंटरसेप्शन और इवेंट लिसनर के बीच कुछ मुख्य अंतर यहां दिए गए हैं:

  • इवेंट लिसनर की मदद से, अनुरोध के डेटा में बदलाव नहीं किया जा सकता.
  • इवेंट लिस्नर का सबसे अच्छा इस्तेमाल, आंकड़ों को ट्रिगर करने या कस्टम फ़ंक्शन के लिए किया जाता है.
playerManager.addEventListener(cast.framework.events.category.CORE,
    event => {
        console.log(event);
    });
  • मैसेज इंटरसेप्ट करने की सुविधा की मदद से, किसी मैसेज को सुना जा सकता है, उसे इंटरसेप्ट किया जा सकता है, और अनुरोध के डेटा में बदलाव किया जा सकता है.
  • मैसेज इंटरसेप्शन का इस्तेमाल, अनुरोध डेटा से जुड़े कस्टम लॉजिक को मैनेज करने के लिए सबसे सही होता है.

मीडिया लोड हो रहा है

MediaInformation, cast.framework.messages.MessageType.LOAD मैसेज में मीडिया लोड करने के लिए कई प्रॉपर्टी उपलब्ध कराता है. इनमें entity, contentUrl, और contentId शामिल हैं.

  • entity, सेंडर और रिसीवर ऐप्लिकेशन, दोनों के लिए लागू करने का सुझाव दिया गया है. यह प्रॉपर्टी, डीप लिंक यूआरएल है. यह प्लेलिस्ट या मीडिया कॉन्टेंट हो सकता है. आपका ऐप्लिकेशन इस यूआरएल को पार्स करे और कम से कम दो फ़ील्ड में से किसी एक को भरे.
  • contentUrl, उस चलाने लायक यूआरएल से मेल खाता है जिसका इस्तेमाल प्लेयर, कॉन्टेंट लोड करने के लिए करेगा. उदाहरण के लिए, यह यूआरएल किसी DASH मेनिफ़ेस्ट की ओर ले जा सकता है.
  • contentId, ऐसा यूआरएल हो सकता है जिस पर कॉन्टेंट चलाया जा सकता है. यह contentUrl प्रॉपर्टी के यूआरएल जैसा ही होता है. इसके अलावा, यह लोड किए जा रहे कॉन्टेंट या प्लेलिस्ट के लिए यूनीक आइडेंटिफ़ायर भी हो सकता है. अगर इस प्रॉपर्टी का इस्तेमाल आइडेंटिफ़ायर के तौर पर किया जा रहा है, तो आपके ऐप्लिकेशन को contentUrl में खेलने लायक यूआरएल डालना चाहिए.

हमारा सुझाव है कि असली आईडी या मुख्य पैरामीटर सेव करने के लिए entity का इस्तेमाल करें. साथ ही, मीडिया के यूआरएल के लिए contentUrl का इस्तेमाल करें. इसका एक उदाहरण यहां दिया गया है. इसमें entity, LOAD अनुरोध में मौजूद है और खेलने लायक contentUrl को वापस पाया गया है:

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...

      if (!loadRequestData.media.entity) {
        // Copy the value from contentId for legacy reasons if needed
        loadRequestData.media.entity = loadRequestData.media.contentId;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          loadRequestData.media.contentUrl = asset.url;
          ...
          return loadRequestData;
        });
    });

डिवाइस की क्षमताएं

getDeviceCapabilities मेथड, कनेक्ट किए गए कास्ट डिवाइस और उससे अटैच किए गए वीडियो या ऑडियो डिवाइस की जानकारी देता है. getDeviceCapabilities तरीके से, Google Assistant, ब्लूटूथ, और कनेक्ट किए गए डिसप्ले और ऑडियो डिवाइसों के बारे में सहायता से जुड़ी जानकारी मिलती है.

यह तरीका एक ऑब्जेक्ट दिखाता है. इस ऑब्जेक्ट के लिए क्वेरी की जा सकती है. इसके लिए, आपको बताए गए किसी एक enum को पास करना होगा, ताकि उस enum के लिए डिवाइस की क्षमता मिल सके. इन एनम को cast.framework.system.DeviceCapabilities में तय किया गया है.

इस उदाहरण में यह जांच की जाती है कि वेब रिसीवर डिवाइस, IS_HDR_SUPPORTED और IS_DV_SUPPORTED कुंजियों के साथ HDR और DolbyVision (DV) में वीडियो चला सकता है या नहीं.

const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
  const deviceCapabilities = context.getDeviceCapabilities();
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
  }
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
  }
});
context.start();

उपयोगकर्ता के इंटरैक्शन को मैनेज करना

कोई उपयोगकर्ता, इन तरीकों से आपके वेब रिसीवर ऐप्लिकेशन से इंटरैक्ट कर सकता है: सेंडर ऐप्लिकेशन (वेब, Android, और iOS), Assistant की सुविधा वाले डिवाइसों पर बोलकर दिए जाने वाले निर्देश, स्मार्ट डिसप्ले पर टच कंट्रोल, और Android TV डिवाइसों पर रिमोट कंट्रोल. Cast SDK, कई एपीआई उपलब्ध कराता है. इनकी मदद से, Web Receiver ऐप्लिकेशन इन इंटरैक्शन को मैनेज कर सकता है. साथ ही, उपयोगकर्ता की कार्रवाई की स्थितियों के ज़रिए ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को अपडेट कर सकता है. इसके अलावा, बदलावों को किसी भी बैकएंड सेवा को अपडेट करने के लिए भेज सकता है.

मीडिया के लिए इस्तेमाल किए जा सकने वाले निर्देश

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

  1. Commands को सेट करने के लिए, PlayerManager.setSupportedMediaCommands का इस्तेमाल करना
  2. addSupportedMediaCommands का इस्तेमाल करके नया निर्देश जोड़ना
  3. removeSupportedMediaCommands का इस्तेमाल करके, किसी मौजूदा कमांड को हटाना.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

जब मालिकाना हक पाने वाला व्यक्ति अपडेट किया गया MediaStatus तैयार करता है, तो इसमें supportedMediaCommands प्रॉपर्टी में किए गए बदलाव शामिल होंगे. स्टेटस ब्रॉडकास्ट होने पर, कनेक्ट किए गए सेंडर ऐप्लिकेशन, अपने यूज़र इंटरफ़ेस (यूआई) में मौजूद बटन को अपडेट कर देंगे.

मीडिया कंट्रोल करने के लिए इस्तेमाल की जा सकने वाली कमांड और टच डिवाइसों के बारे में ज़्यादा जानकारी के लिए, Accessing UI controls गाइड देखें.

उपयोगकर्ता की कार्रवाई की स्थितियों को मैनेज करना

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

  • मीडिया आइटम लोड करते समय, उपयोगकर्ता की प्राथमिकताओं के हिसाब से MediaInformation userActionStates सेट करें.
  • USER_ACTION मैसेज को इंटरसेप्ट करता है और अनुरोध की गई कार्रवाई का पता लगाता है.
  • यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए, MediaInformation UserActionState को अपडेट करें.

नीचे दिए गए स्निपेट में, LOAD अनुरोध को इंटरसेप्ट किया गया है और LoadRequestData के MediaInformation को पॉप्युलेट किया गया है. इस मामले में, उपयोगकर्ता को लोड किया जा रहा कॉन्टेंट पसंद आता है.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
      const userActionLike = new cast.framework.messages.UserActionState(
          cast.framework.messages.UserAction.LIKE);
      loadRequestData.media.userActionStates = [userActionLike];

      return loadRequestData;
    });

नीचे दिए गए स्निपेट में, USER_ACTION मैसेज को इंटरसेप्ट किया गया है. साथ ही, इसमें अनुरोध किए गए बदलाव के साथ बैकएंड को कॉल करने का तरीका बताया गया है. इसके बाद, यह कॉल करके, पैसे पाने वाले के खाते में UserActionState अपडेट करता है.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.USER_ACTION,
  (userActionRequestData) => {
    // Obtain the media information of the current content to associate the action to.
    let mediaInfo = playerManager.getMediaInformation();

    // If there is no media info return an error and ignore the request.
    if (!mediaInfo) {
        console.error('Not playing media, user action is not supported');
        return new cast.framework.messages.ErrorData(messages.ErrorType.BAD_REQUEST);
    }

    // Reach out to backend services to store user action modifications. See sample below.
    return sendUserAction(userActionRequestData, mediaInfo)

    // Upon response from the backend, update the client's UserActionState.
    .then(backendResponse => updateUserActionStates(backendResponse))

    // If any errors occurred in the backend return them to the cast receiver.
    .catch((error) => {
      console.error(error);
      return error;
    });
});

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

function sendUserAction(userActionRequestData, mediaInfo) {
  return new Promise((resolve, reject) => {
    switch (userActionRequestData.userAction) {
      // Handle user action changes supported by the backend.
      case cast.framework.messages.UserAction.LIKE:
      case cast.framework.messages.UserAction.DISLIKE:
      case cast.framework.messages.UserAction.FOLLOW:
      case cast.framework.messages.UserAction.UNFOLLOW:
      case cast.framework.messages.UserAction.FLAG:
      case cast.framework.messages.UserAction.SKIP_AD:
        let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
        setTimeout(() => {resolve(backendResponse)}, 1000);
        break;
      // Reject all other user action changes.
      default:
        reject(
          new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
    }
  });
}

यहां दिए गए स्निपेट में, UserActionRequestData की वैल्यू ली जाती है. इसके बाद, MediaInformation में UserActionState की वैल्यू जोड़ी जाती है या हटाई जाती है. MediaInformation के UserActionState को अपडेट करने से, उस बटन की स्थिति बदल जाती है जो अनुरोध की गई कार्रवाई से जुड़ा होता है. यह बदलाव, स्मार्ट डिसप्ले के कंट्रोल यूज़र इंटरफ़ेस (यूआई), रिमोट कंट्रोल ऐप्लिकेशन, और Android TV के यूज़र इंटरफ़ेस (यूआई) में दिखता है. इसे आउटगोइंग MediaStatus मैसेज के ज़रिए भी ब्रॉडकास्ट किया जाता है, ताकि iOS और Android डिवाइसों से ईमेल भेजने वालों के लिए, बड़े किए गए कंट्रोलर के यूज़र इंटरफ़ेस (यूआई) को अपडेट किया जा सके.

function updateUserActionStates(backendResponse) {
  // Unwrap the backend response.
  let mediaInfo = backendResponse.mediaInfo;
  let userActionRequestData = backendResponse.userActionRequestData;

  // If the current item playing has changed, don't update the UserActionState for the current item.
  if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
    return;
  }

  // Check for existing userActionStates in the MediaInformation.
  // If none, initialize a new array to populate states with.
  let userActionStates = mediaInfo.userActionStates || [];

  // Locate the index of the UserActionState that will be updated in the userActionStates array.
  let index = userActionStates.findIndex((currUserActionState) => {
    return currUserActionState.userAction == userActionRequestData.userAction;
  });

  if (userActionRequestData.clear) {
    // Remove the user action state from the array if cleared.
    if (index >= 0) {
      userActionStates.splice(index, 1);
    }
    else {
      console.warn("Could not find UserActionState to remove in MediaInformation");
    }
  } else {
    // Add the UserActionState to the array if enabled.
    userActionStates.push(
      new cast.framework.messages.UserActionState(userActionRequestData.userAction));
  }

  // Update the UserActionState array and set the new MediaInformation
  mediaInfo.userActionStates = userActionStates;
  playerManager.setMediaInformation(mediaInfo, true);
  return;
}

बोलकर दिए जाने वाले निर्देश

फ़िलहाल, Web Receiver SDK में ये मीडिया कमांड काम करती हैं. ये कमांड, Assistant की सुविधा वाले डिवाइसों के लिए उपलब्ध हैं. इन कमांड के डिफ़ॉल्ट तरीके, cast.framework.PlayerManager में दिए गए हैं.

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

बोलकर दिए जाने वाले निर्देशों के साथ काम करने वाले मीडिया कमांड

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

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

यहाँ दिए गए उदाहरण में, CastReceiverContext को शुरू करते समय CastReceiverOptions दिया जा रहा है. हमने PAUSE कमांड के लिए सहायता जोड़ी है और प्लेयर को सिर्फ़ उस कमांड का इस्तेमाल करने के लिए मजबूर किया है. अब अगर कोई आवाज़ वाला निर्देश, SEEK जैसी किसी दूसरी कार्रवाई का अनुरोध करता है, तो उसे अस्वीकार कर दिया जाएगा. उपयोगकर्ता को सूचना दी जाएगी कि फ़िलहाल, यह निर्देश मौजूद नहीं है.

const context = cast.framework.CastReceiverContext.getInstance();

context.start({
  enforceSupportedCommands: true,
  supportedCommands: cast.framework.messages.Command.PAUSE
});

आपको जिस कमांड को सीमित करना है उसके लिए, अलग-अलग लॉजिक लागू किए जा सकते हैं. enforceSupportedCommands फ़्लैग हटाएं. साथ ही, जिस कमांड को आपको सीमित करना है उसके लिए, आने वाले मैसेज को इंटरसेप्ट किया जा सकता है. यहां हम एसडीके से मिले अनुरोध को इंटरसेप्ट करते हैं, ताकि Assistant की सुविधा वाले डिवाइसों को दी गई SEEK कमांड, आपके वेब रिसीवर ऐप्लिकेशन में सीक करने की सुविधा को ट्रिगर न करें.

मीडिया के जिन निर्देशों के लिए आपका ऐप्लिकेशन काम नहीं करता है उनके लिए, गड़बड़ी की वजह बताएं. जैसे, NOT_SUPPORTED.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.SEEK,
  seekData => {
    // Block seeking if the SEEK supported media command is disabled
    if (!(playerManager.getSupportedMediaCommands() & cast.framework.messages.Command.SEEK)) {
      let e = new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType
      .INVALID_REQUEST);
      e.reason = cast.framework.messages.ErrorReason.NOT_SUPPORTED;
      return e;
    }

    return seekData;
  });

आवाज़ की गतिविधि के आधार पर बैकग्राउंड में ले जाना

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

उदाहरण के लिए, अगर Assistant किसी उपयोगकर्ता की क्वेरी का जवाब दे रही है, तो ऑडियो बुक के चलने की सुविधा को रोकना, उपयोगकर्ता के लिए एक अच्छा अनुभव है.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
  focusStateRequestData => {
    // Pause content when the app is out of focus. Resume when focus is restored.
    if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
      playerManager.pause();
    } else {
      playerManager.play();
    }

    return focusStateRequestData;
  });

आवाज़ से बताई गई कैप्शन की भाषा

जब कोई उपयोगकर्ता कैप्शन के लिए भाषा के बारे में साफ़ तौर पर नहीं बताता है, तो कैप्शन के लिए वही भाषा इस्तेमाल की जाती है जिसमें कमांड बोली गई थी. इन स्थितियों में, आने वाले मैसेज का isSuggestedLanguage पैरामीटर यह बताता है कि उपयोगकर्ता ने भाषा का सुझाव दिया था या साफ़ तौर पर अनुरोध किया था.

उदाहरण के लिए, "Ok Google, कैप्शन चालू करो" निर्देश के लिए, isSuggestedLanguage को true पर सेट किया गया है. ऐसा इसलिए, क्योंकि निर्देश में इस्तेमाल की गई भाषा से यह पता चला कि कैप्शन किस भाषा में दिखाने हैं. अगर किसी भाषा के लिए साफ़ तौर पर अनुरोध किया जाता है, जैसे कि "OK Google, अंग्रेज़ी में कैप्शन चालू करो," तो isSuggestedLanguage को false पर सेट किया जाता है.

मेटाडेटा और वॉइस कास्टिंग

आवाज़ से दिए जाने वाले निर्देशों को डिफ़ॉल्ट रूप से वेब रिसीवर हैंडल करता है. हालांकि, आपको यह पक्का करना चाहिए कि आपके कॉन्टेंट का मेटाडेटा पूरा और सटीक हो. इससे यह पक्का होता है कि Assistant, आवाज़ से दिए गए निर्देशों को सही तरीके से समझ पाएगी. साथ ही, Google Home ऐप्लिकेशन और Google Home Hub जैसे स्मार्ट डिसप्ले जैसे नए इंटरफ़ेस पर मेटाडेटा सही तरीके से दिखेगा.

स्ट्रीम ट्रांसफ़र करना

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

स्ट्रीम ट्रांसफ़र के लिए इवेंट फ़्लो यह है:

  1. सोर्स डिवाइस पर:
    1. मीडिया चलना बंद हो जाता है.
    2. वेब रिसीवर ऐप्लिकेशन को मौजूदा मीडिया की स्थिति सेव करने का निर्देश मिलता है.
    3. वेब रिसीवर ऐप्लिकेशन बंद हो जाता है.
  2. डेस्टिनेशन डिवाइस पर:
    1. वेब रिसीवर ऐप्लिकेशन लोड हो गया है.
    2. वेब रिसीवर ऐप्लिकेशन को, सेव किए गए मीडिया की स्थिति को वापस लाने का निर्देश मिलता है.
    3. मीडिया फिर से चलने लगता है.

मीडिया की स्थिति के इन एलिमेंट में ये शामिल हैं:

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

संगीत को दूसरे स्पीकर पर चलाने की सुविधा चालू करना

अपने वेब रिसीवर के लिए स्ट्रीम ट्रांसफ़र की सुविधा लागू करने के लिए:

  1. STREAM_TRANSFER कमांड का इस्तेमाल करके, supportedMediaCommands को अपडेट करें:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. सेशन की स्थिति बनाए रखना लेख में बताए गए तरीके से, SESSION_STATE और RESUME_SESSION मैसेज इंटरसेप्टर को चाहें, तो बदलें. इन कुकी को सिर्फ़ तब बदलें, जब कस्टम डेटा को सेशन स्नैपशॉट के हिस्से के तौर पर सेव करना हो. ऐसा न होने पर, सेशन की स्थितियों को बनाए रखने के लिए डिफ़ॉल्ट रूप से लागू किया गया तरीका, स्ट्रीम ट्रांसफ़र की सुविधा के साथ काम करेगा.

सेशन की स्थिति बनाए रखना

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

अगर ज़रूरी हो, तो वेब रिसीवर से जनरेट किए गए लोड अनुरोध को SESSION_STATE मैसेज इंटरसेप्टर में बदला जा सकता है. अगर आपको लोड करने के अनुरोध में कस्टम डेटा जोड़ना है, तो हमारा सुझाव है कि आप उन्हें loadRequestData.customData में रखें.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.SESSION_STATE,
    function (sessionState) {
        // Override sessionState.loadRequestData if needed.
        const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
        sessionState.loadRequestData.credentials = newCredentials;

        // Add custom data if needed.
        sessionState.loadRequestData.customData = {
            'membership': 'PREMIUM'
        };

        return sessionState;
    });

कस्टम डेटा को RESUME_SESSION मैसेज इंटरसेप्टर में मौजूद loadRequestData.customData से वापस पाया जा सकता है.

let cred_ = null;
let membership_ = null;

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.RESUME_SESSION,
    function (resumeSessionRequest) {
        let sessionState = resumeSessionRequest.sessionState;

        // Modify sessionState.loadRequestData if needed.
        cred_ = sessionState.loadRequestData.credentials;

        // Retrieve custom data.
        membership_ = sessionState.loadRequestData.customData.membership;

        return resumeSessionRequest;
    });

कॉन्टेंट को पहले से लोड करना

वेब रिसीवर, मीडिया आइटम को पहले से लोड करने की सुविधा देता है. ऐसा, कतार में मौजूद मौजूदा आइटम के चलने के बाद किया जाता है.

प्रीलोड करने की सुविधा, आने वाले आइटम के कई सेगमेंट को पहले से डाउनलोड कर लेती है. यह जानकारी, QueueItem ऑब्जेक्ट में मौजूद preloadTime वैल्यू के आधार पर तय की जाती है. अगर यह वैल्यू नहीं दी जाती है, तो डिफ़ॉल्ट रूप से 20 सेकंड का समय तय किया जाता है. समय को सेकंड में दिखाया जाता है. यह समय, मौजूदा समय में चल रहे आइटम के खत्म होने के समय के हिसाब से होता है. सिर्फ़ पॉज़िटिव वैल्यू मान्य होती हैं. उदाहरण के लिए, अगर वैल्यू 10 सेकंड है, तो यह आइटम पिछले आइटम के खत्म होने से 10 सेकंड पहले प्रीलोड हो जाएगा. अगर प्रीलोड होने में लगने वाला समय, currentItem पर बचे हुए समय से ज़्यादा है, तो प्रीलोडिंग की प्रोसेस जल्द से जल्द शुरू हो जाएगी. इसलिए, अगर queueItem पर प्रीलोड की बहुत बड़ी वैल्यू तय की जाती है, तो इसका मतलब यह होगा कि मौजूदा आइटम को चलाने के दौरान ही, अगले आइटम को प्रीलोड किया जा रहा है. हालांकि, हम इस सेटिंग और विकल्प को डेवलपर के लिए छोड़ देते हैं, क्योंकि इस वैल्यू से, फ़िलहाल चल रहे आइटम के बैंडविड्थ और स्ट्रीमिंग की परफ़ॉर्मेंस पर असर पड़ सकता है.

प्रीलोडिंग की सुविधा, डिफ़ॉल्ट रूप से एचएलएस, डैश, और स्मूथ स्ट्रीमिंग वाले कॉन्टेंट के लिए काम करेगी.

MP4 वीडियो और MP3 जैसी ऑडियो फ़ाइलों को पहले से लोड नहीं किया जाएगा, क्योंकि Cast डिवाइस सिर्फ़ एक मीडिया एलिमेंट के साथ काम करते हैं. साथ ही, जब कोई कॉन्टेंट आइटम चल रहा हो, तब उन्हें पहले से लोड करने के लिए इस्तेमाल नहीं किया जा सकता.

पसंद के मुताबिक बनाए गए मैसेज

वेब रिसीवर ऐप्लिकेशन के लिए, मैसेज एक्सचेंज करने का तरीका मुख्य इंटरैक्शन तरीका है.

भेजने वाला व्यक्ति, Web Receiver को मैसेज भेजता है. इसके लिए, वह उस प्लैटफ़ॉर्म के लिए उपलब्ध Sender API का इस्तेमाल करता है जिस पर वह मैसेज भेज रहा है. जैसे, Android, iOS या वेब. इवेंट लिसनर को पास किए गए इवेंट ऑब्जेक्ट (जो मैसेज का मेनिफ़ेस्टेशन है) में एक डेटा एलिमेंट (event.data) होता है. इसमें डेटा, इवेंट टाइप की प्रॉपर्टी लेता है.

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

सभी नेमस्पेस को एक स्ट्रिंग से तय किया जाता है. साथ ही, यह "urn:x-cast:" से शुरू होना चाहिए. इसके बाद, कोई भी स्ट्रिंग हो सकती है. उदाहरण के लिए, "urn:x-cast:com.example.cast.mynamespace".

यहां कनेक्ट किए गए सेंडर से कस्टम मैसेज सुनने के लिए, वेब रिसीवर का कोड स्निपेट दिया गया है:

const context = cast.framework.CastReceiverContext.getInstance();

const CUSTOM_CHANNEL = 'urn:x-cast:com.example.cast.mynamespace';
context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
  // handle customEvent.
});

context.start();

इसी तरह, Web Receiver ऐप्लिकेशन, कनेक्ट किए गए सेंडर को मैसेज भेजकर, Web Receiver की स्थिति के बारे में जानकारी दे सकते हैं. वेब रिसीवर ऐप्लिकेशन, CastReceiverContext पर sendCustomMessage(namespace, senderId, message) का इस्तेमाल करके मैसेज भेज सकता है. वेब रिसीवर, मैसेज भेजने वाले किसी व्यक्ति को मैसेज भेज सकता है. ऐसा, उसे मिले मैसेज के जवाब में या ऐप्लिकेशन की स्थिति में बदलाव होने की वजह से किया जा सकता है. पॉइंट-टू-पॉइंट मैसेजिंग (64 केबी की सीमा के साथ) के अलावा, वेब रिसीवर कनेक्ट किए गए सभी सेंडर को मैसेज ब्रॉडकास्ट भी कर सकता है.

ऑडियो डिवाइसों पर कास्ट करना

सिर्फ़ ऑडियो चलाने की सुविधा के बारे में जानने के लिए, ऑडियो डिवाइसों के लिए Google Cast की गाइड देखें.

Android TV

इस सेक्शन में बताया गया है कि Google Web Receiver, आपके इनपुट का इस्तेमाल करके कॉन्टेंट कैसे चलाता है. साथ ही, इसमें Android TV के साथ काम करने की सुविधा के बारे में भी बताया गया है.

अपने ऐप्लिकेशन को रिमोट कंट्रोल के साथ इंटिग्रेट करना

Android TV डिवाइस पर चल रहा Google Web Receiver, डिवाइस के कंट्रोल इनपुट (जैसे, हाथ में पकड़कर इस्तेमाल किया जाने वाला रिमोट कंट्रोल) से मिले इनपुट को, urn:x-cast:com.google.cast.media नेमस्पेस के लिए तय किए गए मीडिया प्लेबैक मैसेज के तौर पर ट्रांसलेट करता है. इसके बारे में मीडिया प्लेबैक मैसेज में बताया गया है. Android TV के कंट्रोल इनपुट से, ऐप्लिकेशन के मीडिया प्लेबैक को कंट्रोल करने की बुनियादी सुविधा देने के लिए, आपके ऐप्लिकेशन में इन मैसेज का इस्तेमाल किया जाना चाहिए.

Android TV के साथ काम करने से जुड़े दिशा-निर्देश

यहां कुछ सुझाव दिए गए हैं. साथ ही, कुछ ऐसी सामान्य गलतियों के बारे में बताया गया है जिनसे बचने पर, यह पक्का किया जा सकता है कि आपका ऐप्लिकेशन Android TV के साथ काम करता हो:

  • ध्यान दें कि उपयोगकर्ता-एजेंट स्ट्रिंग में "Android" और "CrKey", दोनों शामिल हैं. कुछ साइटें, "Android" लेबल का पता लगाने के बाद, सिर्फ़ मोबाइल साइट पर रीडायरेक्ट कर सकती हैं. यह न मान लें कि उपयोगकर्ता-एजेंट स्ट्रिंग में "Android" का मतलब हमेशा मोबाइल उपयोगकर्ता होता है.
  • Android का मीडिया स्टैक, डेटा फ़ेच करने के लिए पारदर्शी GZIP का इस्तेमाल कर सकता है. पक्का करें कि आपका मीडिया डेटा, Accept-Encoding: gzip के अनुरोधों का जवाब दे सकता हो.
  • Android TV पर HTML5 मीडिया इवेंट, Chromecast की तुलना में अलग-अलग समय पर ट्रिगर हो सकते हैं. इससे ऐसी समस्याएं सामने आ सकती हैं जो Chromecast पर नहीं दिखती थीं.
  • मीडिया को अपडेट करते समय, <audio>/<video> एलिमेंट से ट्रिगर होने वाले मीडिया से जुड़े इवेंट का इस्तेमाल करें. जैसे, timeupdate, pause, और waiting. नेटवर्किंग से जुड़े इवेंट, जैसे कि progress, suspend, और stalled का इस्तेमाल न करें. ऐसा इसलिए, क्योंकि ये इवेंट प्लैटफ़ॉर्म पर निर्भर करते हैं. अपने रिसीवर में मीडिया इवेंट मैनेज करने के बारे में ज़्यादा जानने के लिए, मीडिया इवेंट देखें.
  • एचटीटीपीएस सर्टिफ़िकेट कॉन्फ़िगर करते समय, इंटरमीडिएट सीए सर्टिफ़िकेट शामिल करना न भूलें. यह पुष्टि करने के लिए कि आपकी साइट के लिए भरोसेमंद सर्टिफ़िकेशन पाथ में, “extra download” लेबल वाला CA सर्टिफ़िकेट शामिल है या नहीं, Qualsys SSL टेस्ट पेज देखें. अगर ऐसा है, तो हो सकता है कि यह Android पर काम करने वाले प्लैटफ़ॉर्म पर लोड न हो.
  • Chromecast, रिसीवर पेज को 720 पिक्सल के ग्राफ़िक्स प्लेन पर दिखाता है. वहीं, Android TV जैसे अन्य Cast प्लैटफ़ॉर्म, पेज को 1080 पिक्सल तक दिखा सकते हैं. पक्का करें कि अलग-अलग रिज़ॉल्यूशन पर, आपका रिसीवर पेज अच्छी तरह से स्केल हो रहा हो.