इस गाइड में, Engage SDK का इस्तेमाल करके, Android TV के ऐप्लिकेशन में 'देखना जारी रखें' सुविधा को इंटिग्रेट करने का तरीका बताया गया है.
सेशन की तैयारी
शुरुआती निर्देशों की गाइड में, सेशन की तैयारी से जुड़े निर्देश पूरे करें.
इंटिग्रेशन
इकाइयां बनाना
एसडीके ने हर आइटम टाइप को दिखाने के लिए अलग-अलग इकाइयां तय की हैं. जारी रखने के लिए क्लस्टर में, इन इकाइयों का इस्तेमाल किया जा सकता है:
इन इकाइयों के लिए, प्लैटफ़ॉर्म के हिसाब से यूआरआई और पोस्टर इमेज तय करें.
इसके अलावा, हर प्लैटफ़ॉर्म—जैसे कि Android TV, Android या iOS—के लिए, वीडियो चलाने के यूआरआई बनाएं. ऐसा तब करें, जब आपने पहले से ऐसा न किया हो. इसलिए, जब कोई उपयोगकर्ता हर प्लैटफ़ॉर्म पर वीडियो देखना जारी रखता है, तो ऐप्लिकेशन, वीडियो कॉन्टेंट चलाने के लिए टारगेट किए गए यूआरआई का इस्तेमाल करता है.
// Required. Set this when you want continue watching entities to show up on
// Google TV
val playbackUriTv = PlatformSpecificUri.Builder()
.setPlatformType(PlatformType.TYPE_ANDROID_TV)
.setActionUri(Uri.parse("https://www.example.com/entity_uri_for_tv"))
.build()
// Required. Set this when you want continue watching entities to show up on
// Google TV Android app, Entertainment Space, Playstore Widget
val playbackUriAndroid = PlatformSpecificUri.Builder()
.setPlatformType(PlatformType.TYPE_ANDROID_MOBILE)
.setActionUri(Uri.parse("https://www.example.com/entity_uri_for_android"))
.build()
// Optional. Set this when you want continue watching entities to show up on
// Google TV iOS app
val playbackUriIos = PlatformSpecificUri.Builder()
.setPlatformType(PlatformType.TYPE_IOS)
.setActionUri(Uri.parse("https://www.example.com/entity_uri_for_ios"))
.build()
val platformSpecificPlaybackUris =
Arrays.asList(playbackUriTv, playbackUriAndroid, playbackUriIos)
पोस्टर इमेज के लिए, यूआरआई और पिक्सल डाइमेंशन (ऊंचाई और चौड़ाई) की ज़रूरत होती है. कई पोस्टर इमेज उपलब्ध कराकर, अलग-अलग फ़ॉर्म फ़ैक्टर को टारगेट करें. हालांकि, पक्का करें कि सभी इमेज का आसपेक्ट रेशियो 16:9 हो और उनकी ऊंचाई कम से कम 200 पिक्सल हो. इससे, "देखना जारी रखें" वाली इकाई, खास तौर पर Google के एंटरटेनमेंट स्पेसमें सही तरीके से दिखेगी. 200 पिक्सल से कम ऊंचाई वाली इमेज नहीं दिखाई जा सकती हैं.
val images = Arrays.asList(
Image.Builder()
.setImageUri(Uri.parse("http://www.example.com/entity_image1.png"))
.setImageHeightInPixel(300)
.setImageWidthInPixel(169)
.build(),
Image.Builder()
.setImageUri(Uri.parse("http://www.example.com/entity_image2.png"))
.setImageHeightInPixel(640)
.setImageWidthInPixel(360)
.build()
// Consider adding other images for different form factors
)
MovieEntity
इस उदाहरण में, सभी ज़रूरी फ़ील्ड के साथ MovieEntity बनाने का तरीका दिखाया गया है:
val movieEntity = MovieEntity.Builder()
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Movie name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
// Suppose the duration is 2 hours, it is 72000000 in milliseconds
.setDurationMills(72000000)
// Suppose last playback offset is 1 hour, 36000000 in milliseconds
.setLastPlayBackPositionTimeMillis(36000000)
.setCallToActionText("Resume")
.addTag("Action")
.build()
Google TV को शैलियां और कॉन्टेंट रेटिंग जैसी जानकारी देने से, उसे आपका कॉन्टेंट ज़्यादा डाइनैमिक तरीके से दिखाने और सही दर्शकों से कनेक्ट करने में मदद मिलती है.
val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val movieEntity = MovieEntity.Builder()
...
.addGenres(genres)
.addContentRatings(contentRatings)
.build()
इकाइयां, डिफ़ॉल्ट रूप से 60 दिनों तक उपलब्ध रहती हैं. हालांकि, अगर आपने कम समयसीमा तय की है, तो वे उससे पहले भी हट सकती हैं. अगर आपको इकाई को डिफ़ॉल्ट समयसीमा से पहले हटाना है, तो ही कस्टम समयसीमा सेट करें.
// Set the expiration time to be now plus 30 days in milliseconds
val expirationTime = DisplayTimeWindow.Builder()
.setEndTimestampMillis(now().toMillis()+2592000000).build()
val movieEntity = MovieEntity.Builder()
...
.addAvailabilityTimeWindow(expirationTime)
.build()
TvEpisodeEntity
इस उदाहरण में, सभी ज़रूरी फ़ील्ड के साथ TvEpisodeEntity बनाने का तरीका दिखाया गया है:
val tvEpisodeEntity = TvEpisodeEntity.Builder()
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Episode name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
.setDurationMills(72000000) // 2 hours in milliseconds
// 45 minutes and 15 seconds in milliseconds is 2715000
.setLastPlayBackPositionTimeMillis(2715000)
.setEpisodeNumber("2")
.setSeasonNumber("1")
.setShowTitle("Title of the show")
.setCallToActionText("Resume")
.addTag("Comedy")
.build()
एपिसोड नंबर स्ट्रिंग (जैसे, "2") और सीज़न नंबर स्ट्रिंग (जैसे, "1")
को, 'देखना जारी रखें' वाले कार्ड पर दिखाने से पहले, सही फ़ॉर्म में बदला जाएगा. ध्यान दें कि ये स्ट्रिंग, संख्या वाली होनी चाहिए. इनमें "e2", "episode 2", "s1" या "season 1" नहीं होना चाहिए.
अगर किसी टीवी शो का सिर्फ़ एक सीज़न है, तो सीज़न नंबर को 1 पर सेट करें.
Google TV पर दर्शकों को आपका कॉन्टेंट आसानी से मिल जाए, इसके लिए शैलियां, कॉन्टेंट रेटिंग, और उपलब्धता की समयसीमा जैसी अतिरिक्त जानकारी दें. इससे, कॉन्टेंट को बेहतर तरीके से दिखाया जा सकता है और फ़िल्टर करने के विकल्प भी बेहतर हो सकते हैं.
val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val tvEpisodeEntity = TvEpisodeEntity.Builder()
...
.addGenres(genres)
.addContentRatings(contentRatings)
.setSeasonTitle("Season Title")
.setShowTitle("Show Title")
.build()
VideoClipEntity
यहां, सभी ज़रूरी फ़ील्ड के साथ VideoClipEntity बनाने का एक उदाहरण दिया गया है.
VideoClipEntity, YouTube वीडियो जैसे उपयोगकर्ता के जनरेट किए गए क्लिप को दिखाता है.
val videoClipEntity = VideoClipEntity.Builder()
.setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform"))
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Video clip name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
.setDurationMills(600000) //10 minutes in milliseconds
.setLastPlayBackPositionTimeMillis(300000) //5 minutes in milliseconds
.addContentRating(contentRating)
.setCallToActionText("Resume")
.addTag("Vlog")
.build()
आपके पास क्रिएटर, क्रिएटर की इमेज, मिलीसेकंड में बनाया गया समय या उपलब्धता की समयसीमा सेट करने का विकल्प होता है .
LiveStreamingVideoEntity
यहां, सभी ज़रूरी फ़ील्ड के साथ LiveStreamingVideoEntity बनाने का एक उदाहरण दिया गया है.
val liveStreamingVideoEntity = LiveStreamingVideoEntity.Builder()
.setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform"))
.setWatchNextType(WatchNextType.TYPE_CONTINUE)
.setName("Live streaming name")
.addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
.addPosterImages(images)
// Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
.setLastEngagementTimeMillis(1701388800000)
.setDurationMills(72000000) //2 hours in milliseconds
.setLastPlayBackPositionTimeMillis(36000000) //1 hour in milliseconds
.addContentRating(contentRating)
.setCallToActionText("Resume")
.addTag("Live")
.build()
लाइव स्ट्रीमिंग वाली इकाई के लिए, आपके पास शुरू होने का समय, ब्रॉडकास्टर, ब्रॉडकास्टर का आइकॉन या उपलब्धता की समयसीमा सेट करने का विकल्प होता है.
एट्रिब्यूट और ज़रूरी शर्तों के बारे में ज़्यादा जानकारी के लिए, एपीआई के बारे में जानकारी देखें.
जारी रखने के लिए क्लस्टर का डेटा उपलब्ध कराना
AppEngagePublishClient, जारी रखने के लिए क्लस्टर को पब्लिश करने की ज़िम्मेदारी लेता है.
ContinuationCluster ऑब्जेक्ट को पब्लिश करने के लिए, publishContinuationCluste तरीके का इस्तेमाल करें.
client.publishContinuationCluster(
PublishContinuationClusterRequest
.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.setAccountProfile(accountProfile)
.addEntity(movieEntity1)
.addEntity(movieEntity2)
.addEntity(tvEpisodeEntity1)
.addEntity(tvEpisodeEntity2)
.setSyncAcrossDevices(true)
.build()
)
.build()
)
जब सेवा को अनुरोध मिलता है, तो एक ही लेन-देन में ये कार्रवाइयां होती हैं:
- डेवलपर पार्टनर का मौजूदा
ContinuationClusterडेटा हटा दिया जाता है. - अनुरोध से मिले डेटा को पार्स किया जाता है और अपडेट किए गए
ContinuationClusterमें सेव किया जाता है.
गड़बड़ी होने पर, पूरे अनुरोध को अस्वीकार कर दिया जाता है और मौजूदा स्थिति बनी रहती है.
पब्लिश करने वाले एपीआई, अपसर्ट एपीआई होते हैं. ये मौजूदा कॉन्टेंट को बदल देते हैं. अगर आपको जारी रखने के लिए क्लस्टर में किसी खास इकाई को अपडेट करना है, तो आपको सभी इकाइयों को फिर से पब्लिश करना होगा.
जारी रखने के लिए क्लस्टर का डेटा सिर्फ़ वयस्क खातों के लिए उपलब्ध कराया जाना चाहिए. सिर्फ़ तब पब्लिश करें, जब खाता प्रोफ़ाइल किसी वयस्क की हो.
क्रॉस-डिवाइस सिंक करने की सुविधा
setSyncAcrossDevices से यह कंट्रोल होता है कि उपयोगकर्ता का ContinuationCluster डेटा, अलग-अलग डिवाइसों पर सिंक किया जाए या नहीं. जैसे, टीवी, फ़ोन, टैबलेट वगैरह. क्रॉस-डिवाइस सिंक करने की सुविधा, डिफ़ॉल्ट रूप से बंद होती है.
वैल्यू:
true: जारी रखने के लिए क्लस्टर का डेटा, उपयोगकर्ता के सभी डिवाइसों पर शेयर किया जाता है, ताकि उसे वीडियो देखने का बेहतर अनुभव मिले. हमारा सुझाव है कि अलग-अलग डिवाइसों पर बेहतर अनुभव के लिए, इस विकल्प को चुनें.false: जारी रखने के लिए क्लस्टर का डेटा, सिर्फ़ मौजूदा डिवाइस पर उपलब्ध होता है.
इसके अलावा, कॉन्टेंट को अलग-अलग डिवाइसों के बीच सिंक करने के लिए, आपको खाता आईडी के साथ AccountProfile उपलब्ध कराना होगा. खाता प्रोफ़ाइल बनाना लेख पढ़ें
.
सहमति लेना
मीडिया ऐप्लिकेशन में, क्रॉस-डिवाइस सिंक करने की सुविधा को चालू या बंद करने के लिए, साफ़ तौर पर सेटिंग उपलब्ध होनी चाहिए. उपयोगकर्ता को इस सुविधा के फ़ायदों के बारे में बताएं. साथ ही, उपयोगकर्ता की प्राथमिकता को एक बार सेव करें और उसके मुताबिक, publishContinuationCluster में इसे लागू करें.
// Example to allow cross device syncing.
client.publishContinuationCluster(
PublishContinuationClusterRequest
.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.setAccountProfile(accountProfile)
.setSyncAcrossDevices(true)
.build()
)
.build()
)
हमारी क्रॉस-डिवाइस सुविधा का ज़्यादा से ज़्यादा फ़ायदा पाने के लिए, पक्का करें कि ऐप्लिकेशन, उपयोगकर्ता की सहमति ले और SyncAcrossDevices को true पर सेट करे. इससे, कॉन्टेंट को अलग-अलग डिवाइसों पर आसानी से सिंक किया जा सकता है. इससे उपयोगकर्ताओं को बेहतर अनुभव मिलता है और उनका जुड़ाव बढ़ता है. उदाहरण के लिए, इस सुविधा को लागू करने वाले किसी पार्टनर के "देखना जारी रखें" पर मिलने वाले क्लिक में 40% की बढ़ोतरी हुई. ऐसा इसलिए हुआ, क्योंकि उसका कॉन्टेंट अलग-अलग डिवाइसों पर दिखाया गया.
Engage का डेटा मिटाना
Google TV के सर्वर से, उपयोगकर्ता का डेटा मैन्युअल तरीके से मिटाने के लिए, deleteClusters तरीके का इस्तेमाल करें. ऐसा तब करें, जब डेटा को सेव रखने की 60 दिनों की सामान्य समयसीमा पूरी न हुई हो. अनुरोध मिलने पर, सेवा, खाता प्रोफ़ाइल या पूरे खाते के लिए, Engage का मौजूदा सारा डेटा मिटा देगी.
The DeleteReason enum, डेटा मिटाने की वजह तय करता है.
यहां दिया गया कोड, लॉग आउट करने पर 'देखना जारी रखें' का डेटा मिटा देता है.
// If the user logs out from your media app, you must make the following call
// to remove continue watching data from the current google TV device,
// otherwise, the continue watching data will persist on the current
// google TV device until 60 days later.
client.deleteClusters(
DeleteClustersRequest.Builder()
.setAccountProfile(AccountProfile())
.setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
.setSyncAcrossDevices(true)
.build()
)
जांच करना
पुष्टि करने वाले ऐप्लिकेशन का इस्तेमाल करके, यह पुष्टि करें कि Engage SDK का इंटिग्रेशन सही तरीके से काम कर रहा है.
पब्लिश करने वाले एपीआई को शुरू करने के बाद, पुष्टि करने वाले ऐप्लिकेशन की जांच करके पुष्टि करें कि आपका डेटा सही तरीके से पब्लिश किया जा रहा है. जारी रखने के लिए क्लस्टर को, ऐप्लिकेशन के इंटरफ़ेस में एक अलग लाइन के तौर पर दिखाया जाना चाहिए.
- अपने ऐप्लिकेशन में इन कार्रवाइयों की जांच करें:
- साइन इन करें.
- प्रोफ़ाइलों के बीच स्विच करें(अगर यह सुविधा उपलब्ध है).
- कोई वीडियो चलाएं, फिर उसे रोकें या होम पेज पर वापस जाएं.
- वीडियो चलाने के दौरान, ऐप्लिकेशन बंद करें.
- "देखना जारी रखें" वाली लाइन से कोई आइटम हटाएं (अगर यह सुविधा उपलब्ध है).
- हर कार्रवाई के बाद, पुष्टि करें कि आपके ऐप्लिकेशन ने
publishContinuationClustersएपीआई को शुरू किया है और पुष्टि करने वाले ऐप्लिकेशन में डेटा सही तरीके से दिख रहा है. पुष्टि करने वाले ऐप्लिकेशन में, सही तरीके से लागू की गई इकाइयों के लिए, "सब ठीक है" का हरा सही का निशान दिखता है.
पहली इमेज. पुष्टि करने वाले ऐप्लिकेशन में पुष्टि सफल रही पुष्टि करने वाला ऐप्लिकेशन, गड़बड़ी वाली इकाइयों के बारे में सूचना देगा.
दूसरी इमेज. पुष्टि करने वाले ऐप्लिकेशन में गड़बड़ी हुई गड़बड़ी वाली इकाइयों की समस्या हल करने के लिए, टीवी के रिमोट का इस्तेमाल करके, पुष्टि करने वाले ऐप्लिकेशन में इकाई को चुनें और उस पर क्लिक करें. आपकी समीक्षा के लिए, गड़बड़ियां दिखेंगी और उन्हें लाल रंग में हाइलाइट किया जाएगा (नीचे दिया गया उदाहरण देखें).
तीसरी इमेज. पुष्टि करने वाले ऐप्लिकेशन में गड़बड़ी की जानकारी