इस गाइड में, डेवलपर के लिए निर्देश दिए गए हैं. इनमें बताया गया है कि Engage SDK का इस्तेमाल करके, Google TV के साथ ऐप्लिकेशन की सदस्यता और एनटाइटलमेंट का डेटा कैसे शेयर किया जा सकता है. उपयोगकर्ता, अपनी सदस्यता के हिसाब से कॉन्टेंट ढूंढ सकते हैं और Google TV पर काम के कॉन्टेंट के सुझाव पाने की सुविधा चालू कर सकते हैं. ये सुझाव उसे टीवी, फ़ोन, और टैबलेट पर Google TV इस्तेमाल करते हुए मिलेंगे.
ज़रूरी शर्तें
डिवाइस के एनटाइटलमेंट एपीआई का इस्तेमाल करने से पहले, मीडिया ऐक्शन फ़ीड को ऑनबोर्ड करना ज़रूरी है. अगर आपने अब तक मीडिया ऐक्शन फ़ीड को ऑनबोर्ड नहीं किया है, तो इसकी प्रोसेस शुरू करें.
सेशन की तैयारी
शुरू करने से पहले, यह तरीका अपनाएं पुष्टि करें कि आपका ऐप्लिकेशन, इस इंटिग्रेशन के लिए एपीआई लेवल 19 या उसके बाद के लेवल को टारगेट करता हो
अपने ऐप्लिकेशन में
com.google.android.engage
लाइब्रेरी जोड़ें:इंटिग्रेशन में इस्तेमाल करने के लिए, अलग-अलग एसडीके टूल उपलब्ध हैं: एक मोबाइल ऐप्लिकेशन के लिए और दूसरा टीवी ऐप्लिकेशन के लिए.
मोबाइल के लिए
dependencies { implementation 'com.google.android.engage:engage-core:1.5.5 }
टीवी के लिए
dependencies { implementation 'com.google.android.engage:engage-tv:1.0.2 }
AndroidManifest.xml
फ़ाइल में, Engage सेवा के एनवायरमेंट को प्रोडक्शन पर सेट करें.मोबाइल ऐप्लिकेशन के APK के लिए
<meta-data android:name="com.google.android.engage.service.ENV" android:value="PRODUCTION"> </meta-data>
टीवी के लिए APK
<meta-data android:name="com.google.android.engage.service.ENV" android:value="PRODUCTION"> </meta-data>
Google को APK भेजने से पहले, अपनी AndroidManifest.xml फ़ाइल में, Engage सेवा के एनवायरमेंट को प्रोडक्शन पर सेट करें. बेहतर परफ़ॉर्मेंस और आने वाले समय में साथ काम करने की बेहतर संभावना के लिए, डेटा को सिर्फ़ तब पब्लिश करें, जब ऐप्लिकेशन फ़ोरग्राउंड में हो और उपयोगकर्ता उससे इंटरैक्ट कर रहा हो. जैसे, ऐप्लिकेशन लॉन्च करने पर, लॉगिन करने के बाद या ऐप्लिकेशन का इस्तेमाल करते समय. बैकग्राउंड में प्रोसेस चलने के दौरान डेटा पब्लिश न करें.
इन इवेंट पर सदस्यता की जानकारी पब्लिश करें:
- जब उपयोगकर्ता आपके ऐप्लिकेशन में लॉग इन करे.
- जब उपयोगकर्ता, प्रोफ़ाइलों के बीच स्विच करे (अगर प्रोफ़ाइलें इस्तेमाल की जा सकती हैं).
- जब उपयोगकर्ता नई सदस्यता ख़रीदे.
- जब उपयोगकर्ता अपनी मौजूदा सदस्यता अपग्रेड करे.
- जब उपयोगकर्ता की सदस्यता खत्म हो जाए.
एसडीके टूल इंटिग्रेशन
इस सेक्शन में, अलग-अलग तरह की सदस्यताएं मैनेज करने के लिए, AccountProfile
और SubscriptionEntity
को लागू करने से जुड़े ज़रूरी कोड के उदाहरण और निर्देश दिए गए हैं.
उपयोगकर्ता खाता और प्रोफ़ाइल
Google TV पर अपनी दिलचस्पी के मुताबिक सुविधाएं पाने के लिए, खा��े ���� ��ा������री दें. AccountProfile
का इस्तेमाल करके, यह जानकारी दें:
- खाता आईडी: यह एक यूनीक आइडेंटिफ़ायर है, जो उपयोगकर्ता के खाते को दिखाता है. यह असली खाता आईडी या सही तरीके से अस्पष्ट बनाया गया वर्शन हो सकता है.
// Set the account ID to which the subscription applies.
// Don't set the profile ID because subscription applies to account level.
val accountProfile = AccountProfile.Builder()
.setAccountId("user_account_id")
.setProfileId("user_profile id")
.build();
एक ही टियर की सदस्यता
कुछ उपयोगकर्ता, मीडिया सेवा देने वाली कंपनियों की बुनियादी सदस्यताएं लेते हैं. उदाहरण के लिए, ऐसी सेवा जिसमें सदस्यता का एक टियर होता है जो पैसे चुकाकर खरीदे जाने वाले सारे कॉन्टेंट का ऐक्सेस देता है. ऐसे उपयोगकर्ताओं के लिए, यह ज़रूरी जानकारी दें:
सदस्यता का टाइप: साफ़ तौर पर बताएं कि उपयोगकर्ता के पास कौनसा सदस्यता प्लान है.
SUBSCRIPTION_TYPE_ACTIVE
: उपयोगकर्ता के पास पैसे चुकाकर ली गई सक्रिय सदस्यता है.SUBSCRIPTION_TYPE_ACTIVE_TRIAL
: उपयोगकर्ता के पास मुफ़्त में आज़माने की सदस्यता है.SUBSCRIPTION_TYPE_INACTIVE
: उपयोगकर्ता के पास खाता है, लेकिन उसके पास कोई चालू या मुफ़्त में आज़माने की सदस्यता नहीं है.
समयसीमा: यह मिलीसेकंड में तय की गई वह अवधि होती है. यह अवधि तय करना ज़रूरी नहीं है. यह बताएं कि सदस्यता कब खत्म होगी.
सेवा देने वाली कंपनी के ऐप्लिकेशन का पै��ेज नाम: उस ऐप्लिकेशन का पैकेज नाम डालें जो सदस्यता मैनेज करता है.
मीडिया सेवा देने वाली कंपनी के फ़ीड के सैंपल का उदाहरण.
"actionAccessibilityRequirement": [
{
"@type": "ActionAccessSpecification",
"category": "subscription",
"availabilityStarts": "2022-06-01T07:00:00Z",
"availabilityEnds": "2026-05-31T07:00:00Z",
"requiresSubscription": {
"@type": "MediaSubscription",
// Don't match this string,
// ID is only used to for reconciliation purpose
"@id": "https://www.example.com/971bfc78-d13a-4419",
// Don't match this, as name is only used for displaying purpose
"name": "Basic common name",
"commonTier": true
}
यहां दिए गए उदाहरण में, किसी उपयोगकर्ता के लिए SubscriptionEntity
बनाने का तरीका बताया गया है:
val subscription = SubscriptionEntity
.Builder()
setSubscriptionType(
SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
)
.setProviderPackageName("com.google.android.example")
// Optional
// December 30, 2025 12:00:00AM in milliseconds since epoch
.setExpirationTimeMillis(1767052800000)
.build();
प्रीमियम सदस्यता
अगर ऐप्लिकेशन में प्रीमियम सदस्यता के कई टियर वाले पैकेज उपलब्ध हैं, जिनमें सामान्य टियर के अलावा ज़्यादा कॉन्टेंट या सुविधाएं शामिल हैं, तो सदस्यता में एक या उससे ज़्यादा एनटाइटलमेंट जोड़कर इसे दिखाएं.
इस एनटाइटलमेंट में ये फ़ील्ड शामिल होते हैं:
- आइडेंटिफ़ायर: इस एनटाइटलमेंट के लिए, यह आइडेंटिफ़ायर स्ट्रिंग ज़रूरी है. यह, मीडिया सेवा देने वाली कंपनी के Google TV पर पब्लिश किए गए फ़ीड में दिए गए एनटाइटलमेंट आइडेंटिफ़ायर में से किसी एक से मेल खाना चाहिए. ध्यान दें कि यह आईडी फ़ील्ड नहीं है.
- नाम: यह सहायक जानकारी है. इसका इस्तेमाल, एनटाइटलमेंट मैच करने के लिए किया जाता है. हालांकि, एनटाइटलमेंट का ऐसा नाम देना ज़रूरी नहीं है जिस�� आसानी से पढ़ा जा सके. फिर भी, ऐसा करने से डेवलपर और सहायता टीमों, दोनों को उपयोगकर्ता के एनटाइटलमेंट के बारे में बेहतर तरीके से समझने में मदद मिलती है. उदाहरण के लिए: Sling Orange.
- Expiration TimeMillis: अगर यह एनटाइटलमेंट, सदस्यता के खत्म होने के समय से अलग है, तो इसके लिए समयसीमा खत्म होने का समय मिली��ेकंड में बताएं. यह जानकारी देना ज़रूरी नहीं है. डिफ़ॉल्ट रूप से, सदस्यता की समयसीमा खत्म होने पर एनटाइटलमेंट भी खत्म हो जाएगा.
मीडिया सेवा देने वाली कंपनी के फ़ीड के सैंपल के इस उदाहरण के लिए:
"actionAccessibilityRequirement": [
{
"@type": "ActionAccessSpecification",
"category": "subscription",
"availabilityStarts": "2022-06-01T07:00:00Z",
"availabilityEnds": "2026-05-31T07:00:00Z",
"requiresSubscription": {
"@type": "MediaSubscription",
// Don't match this string,
// ID is only used to for reconciliation purpose
"@id": "https://www.example.com/971bfc78-d13a-4419",
// Don't match this, as name is only used for displaying purpose
"name": "Example entitlement name",
"commonTier": false,
// match this identifier in your API. This is the crucial
// entitlement identifier used for recommendation purpose.
"identifier": "example.com:entitlementString1"
}
यहां दिए गए उदाहरण में, सदस्यता लेने वाले उपयोगकर्ता के लिए SubscriptionEntity
बनाया गया है:
// Subscription with entitlements.
// The entitlement expires at the same time as its subscription.
val subscription = SubscriptionEntity
.Builder()
.setSubscriptionType(
SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
)
.setProviderPackageName("com.google.android.example")
// Optional
// December 30, 2025 12:00:00AM in milliseconds
.setExpirationTimeMillis(1767052800000)
.addEntitlement(
SubscriptionEntitlement.Builder()
// matches with the identifier in media provider feed
.setEntitlementId("example.com:entitlementString1")
.setDisplayName("entitlement name1")
.build()
)
.build();
// Subscription with entitlements
// The entitement has different expiration time from its subscription
val subscription = SubscriptionEntity
.Builder()
.setSubscriptionType(
SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
)
.setProviderPackageName("com.google.android.example")
// Optional
// December 30, 2025 12:00:00AM in milliseconds
.setExpirationTimeMillis(1767052800000)
.addEntitlement(
SubscriptionEntitlement.Builder()
.setEntitlementId("example.com:entitlementString1")
.setDisplayName("entitlement name1")
// You may set the expiration time for entitlement
// December 15, 2025 10:00:00 AM in milliseconds
.setExpirationTimeMillis(1765792800000)
.build())
.build();
लिंक की गई सेवा के पैकेज की सदस्यता
आम तौर पर सदस्यताएं, शुरुआती ऐप्लिकेशन को मीडिया सेवा देने वाली कंपनी से जुड़ी होती हैं. हालांकि, सदस्यता को लिंक किए गए सेवा पैकेज से जोड़ा जा सकता है. इसके लिए, सदस्यता में लिंक किए गए सेवा पैकेज का नाम डाला जाना चाहिए.
यहां दिए गए कोड सैंपल में, उपयोगकर्ता की सदस्यता बनाने का तरीका बताया गया है.
// Subscription for linked service package
val subscription = SubscriptionEntity
.Builder()
.setSubscriptionType(
SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
)
.setProviderPackageName("com.google.android.example")
// Optional
// December 30, 2025 12:00:00AM in milliseconds since epoch
.setExpirationTimeMillis(1767052800000)
.build();
इसके अलावा, अगर उपयोगकर्ता के पास किसी सहायक सेवा की कोई दूसरी सदस्यता है, तो एक और सदस्यता जोड़ें और लिंक क��� ��ई सेवा के पैकेज क��� ��ाम उस हिसाब से सेट करें.
// Subscription for linked service package
val linkedSubscription = Subscription
.Builder()
.setSubscriptionType(
SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
)
.setProviderPackageName("linked service package name")
// Optional
// December 30, 2025 12:00:00AM in milliseconds since epoch
.setExpirationTimeMillis(1767052800000)
.addBundledSubscription(
BundledSubscription.Builder()
.setBundledSubscriptionProviderPackageName(
"bundled-subscription-package-name"
)
.setSubscriptionType(SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE)
.setExpirationTimeMillis(111)
.addEntitlement(
SubscriptionEntitlement.Builder()
.setExpirationTimeMillis(111)
.setDisplayName("Silver subscription")
.setEntitlementId("subscription.tier.platinum")
.build()
)
.build()
)
.build();
इसके अलावा, लिंक की गई सेवा की सदस्यता में भी एनटाइटलमेंट जोड़े जा सकते हैं.
सदस्यता का सेट उपलब्ध कराना
कॉन्टेंट पब्लिश करने का काम, ऐप्लिकेशन के फ़ोरग्राउंड में होने पर पूरा करें.
SubscriptionCluster
ऑब्जेक्ट पब्लिश करने के लिए, AppEngagePublishClient
क्लास के publishSubscriptionCluster()
तरीके का इस्तेमाल करें.
isServiceAvailable
का इस्तेमाल करके देखें कि सेवा, इंटिग्रेशन के लिए उपलब्ध है या नहीं.
client.publishSubscription(
PublishSubscriptionRequest.Builder()
.setAccountProfile(accountProfile)
.setSubscription(subscription)
.build();
)
setSubscription()
का इस्तेमाल करके, यह पुष्टि करें कि उपयोगकर्ता के पास सेवा की सिर्फ़ एक सदस्यता होनी चाहिए.
addLinkedSubscription()
या addLinkedSubscriptions()
का इस्तेमाल करें. ये दोनों, लिंक की गई सदस्यताओं की सूची स्वीकार करते हैं. इससे उपयोगकर्ता को लिंक की गई शून्य या उससे ज़्यादा सदस्यताएं मिल सकती हैं.
जब सेवा को अनुरोध मिलता है, तो एक नई एंट्री बन जाती है. साथ ही, पुरानी एंट्री 60 दिनों के बाद अपने-आप मिट जाती है. सिस्टम हमेशा नई एंट्री का इस्तेमाल करता है. गड़बड़ी होने पर, पूरे अनुरोध को अस्वीकार कर दिया जाता है और मौज���दा स्थिति बनी रहती है.
सदस्यता की जानकारी अप-टू-डेट रखना
- जब भी किसी उपयोगकर्ता की सदस्यता की स्थिति में बदलाव हो, तो बदलाव का अपडेट तुरंत देने के लिए,
publishSubscriptionCluster()
को कॉल करें. जैसे, सदस्यता चालू होना, बंद होना, अपग्रेड होना, डाउनग्रेड होना वगैरह. सटीक जानकारी देने के लिए, हर महीने कम से कम एक बार
publishSubscriptionCluster()
कॉल करें.वीडियो डिस्कवरी के डेटा को मिटाने के लिए,
client.deleteClusters()
तरीके का इस्तेमाल करें. इससे, डेटा के रखरखाव की 60 दिनों की स्टैंडर्ड अवधि से पहले, Google TV सर्वर से किसी उपयोगकर्ता का डेटा मैन्युअल तरीके से मिटाया जा सकता है. इससे खाते की प्रोफ़ाइल या पूरे खाते के लिए, वीडियो डिस्कवरी से जुड़ा मौजूदा डेटा मिट जाता है. यह इस बात पर निर्भर करता है किDeleteReason
क्या दिया गया है.उपयोगकर्ता की सदस्यता हटाने के लिए कोड स्निपेट
// If the user logs out from your media app, you must make the following call // to remove subscription and other video discovery data from the current // google TV device. client.deleteClusters( new DeleteClustersRequest.Builder() .setAccountProfile( AccountProfile .Builder() .setAccountId() .setProfileId() .build() ) .setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT) .build() ) ``` Following code snippet demonstrates removal of user subscription when user revokes the consent. ```Kotlin // If the user revokes the consent to share across device, make the call // to remove subscription and other video discovery data from all google // TV devices. client.deleteClusters( new DeleteClustersRequest.Builder() .setAccountProfile( AccountProfile .Builder() .setAccountId() .setProfileId() .build() ) .setReason(DeleteReason.DELETE_REASON_LOSS_OF_CONSENT) .build() ) ``` Following code demonstrates how to remove subscription data on user profile deletion. ```Kotlin // If the user delete a specific profile, you must make the following call // to remove subscription data and other video discovery data. client.deleteClusters( new DeleteClustersRequest.Builder() .setAccountProfile( AccountProfile .Builder() .setAccountId() .setProfileId() .build() ) .setReason(DeleteReason.DELETE_REASON_ACCOUNT_PROFILE_DELETION) .build() )
टेस्ट करना
इस सेक्शन में, सदस्यता लागू करने की प्रोसेस की जांच करने के लिए सिलसिलेवार निर्देश दिए गए हैं. लॉन्च करने से पहले, पुष्टि करें कि डेटा कितना सटीक है और सही तरीके से काम कर रहा है या नहीं.
इंटिग्रेशन पब्लिश करने की चेकलिस्ट
डेटा को तब पब्लिश किया जाना चाहिए, जब ऐप्लिकेशन फ़ोरग्राउंड में हो और उपयोगकर्ता उससे इंटरैक्ट कर रहा हो.
इन स्थितियों में पब्लिश करें:
- जब कोई उपयोगकर्ता पहली बार लॉग इन करे.
- जब उपयोगकर्ता प्रोफ़ाइल बदले (अगर प्रोफ़ाइलें इस्तेमाल की जा सकती हैं).
- जब उपयोगकर्ता नई सदस्यता खरीदे.
- जब उपयोगकर्ता ने सदस्यता अपग्रेड की हो.
- जब उपयोगकर्ता की सदस्यता खत्म हो जाए.
देखें कि ऐप्लिकेशन, पब्लिशिंग इवेंट पर logcat में
isServiceAvailable()
औरpublishClusters()
एपीआई को सही तरीके से कॉल कर रहा है या नहीं.पुष्टि करें कि डेटा, पुष्टि करने वाले ऐप्लिकेशन में दिख रहा हो. पुष्टि करने वाले ऐप्लिकेशन में, सदस्यता को एक अलग लाइन के तौर पर दिखाया जाना चाहिए. प्रकाशन का एपीआई शुरू करने पर, डेटा की पुष्टि करने वाले ऐप्लिकेशन में डेटा दिखना चाहिए.
- ��ुष्टि करें कि ऐप्लिकेशन की Android मेनिफ़ेस्ट फ़ाइल में, Engage Service Flag को प्रोडक्शन के लिए सेट नहीं किया गया है.
- Engage Verification ऐप्लिकेशन इंस्टॉल करें और खोलें.
- अगर पुष्टि करने वाले ऐप्लिकेशन में
isServiceAvailable
की वैल्यूfalse
है, तो इसेtrue
पर सेट करने के लिए, पुष्टि करने वाले ऐप्लिकेशन में मौजूदToggle
बटन पर क्लिक करें. - ऐप्लिकेशन के पैकेज का नाम डालें. इससे पब्लिश किया गया डेटा अपने-आप दिखता है.
ऐप्लिकेशन पर जाएं और यहां दी गई हर कार्रवाई करें:
- साइन इन करें.
- प्रोफ़ाइलों के बीच स्विच करें (अगर यह सुविधा उपलब्ध है).
- नई सदस्यता खरीदें.
- मौजूदा सदस्यता को अपग्रेड करें.
- सदस्यता खत्म करें.
इंटिग्रेशन की पुष्टि करना
अपने इंटिग्रेशन की जांच करने के लिए, पुष्टि करने वाले ऐप्लिकेशन का इस्तेमाल करें.
पुष्टि करने वाला ऐप्लिकेशन, एक Android ऐप्लिकेशन है. डेवलपर इसका इस्तेमाल यह पुष्टि करने के लिए कर सकते हैं कि इंटिग्रेशन काम कर रहा है. इस ऐप्लिकेशन में ऐसी सुविधाएं शामिल हैं जिनसे डेवलपर को डेटा की पुष्टि करने और इंटेंट ब्रॉडकास्ट करने में मदद मिलती है. इससे लॉन्च से पहले, यह पुष्टि करने में मदद मिलती है कि डेटा कितना सटीक है और सही तरीके से काम कर रहा है या नहीं.
- हर इवेंट के लिए, देखें कि ऐप्लिकेशन ने
publishSubscription
API को कॉल किया है या नहीं. पुष्टि करने वाले ऐप्लिकेशन में, पब्लिश किए गए डेटा की पुष्टि करें. पुष्टि करें कि पुष्टि करने वाले ऐप्लिकेशन में सब कुछ हरा है अगर सभी एंटिटी की जानकारी सही है, तो सभी एंटिटी में "ठीक है" वाला हरे रंग का सही का निशान दिखता है.
पहली इमेज. सदस्यता ली गई पुष्टि करने वाले ऐप्लिकेशन में भी समस्याओं को हाइलाइट किया जाता है
दूसरी इमेज.सदस्यता नहीं ली जा सकी बंडल की गई सदस्यता में मौजूद स��स्याएं देखने के लिए, टीवी रिमोट का इस्तेमाल करके बंडल की गई उस सदस्यता पर फ़ोकस करें. इसके बाद, समस्याएं देखने के लिए क्लिक करें. ऐसा हो सकता है कि आपको पहले लाइन पर फ़ोकस करना पड़े. इसके बाद, बंडल की गई सदस्यता वाला कार्ड ढूंढने के लिए, दाईं ओर जाएं. समस्याओं को लाल रंग से हाइलाइट किया गया है, जैसा कि तीसरी इमेज में दिखाया गया है. इसके अलावा, बंडल की गई सदस्यता में एनटाइटलमेंट से जुड़ी समस्याएं देखने के लिए, रिमोट का इस्तेमाल करके नीचे जाएं
तीसरी इमेज.सदस्यता से जुड़ी गड़बड़ियां एनटाइटलमेंट से जुड़ी समस्याएं देखने के लिए, टीवी रिमोट का इस्तेमाल करके उस एनटाइटलमेंट पर फ़ोकस करें और समस्याएं देखने के लिए क्लिक करें. समस्याओं को लाल रंग में हाइलाइट किया गया है.
चौथी इमेज.सदस्यता से जुड़ी गड़बड़ी की जानकारी
डाउनलोड करें
डाउनलोड करने से पहले, आपको नीचे दी गई शर्तों को स्वीकार करना होगा.