इस गाइड में, डेवलपर के लिए निर्देश दिए गए हैं. इनमें बताया गया है कि Engage SDK का इस्तेमाल करके, Google TV के साथ ऐप्लिकेशन की सदस्यता और एनटाइटलमेंट का डेटा कैसे शेयर किया जा सकता है. उपयोगकर्ता, अपनी सदस्यता के हिसाब से कॉन्टेंट ढूंढ सकते हैं. साथ ही, Google TV को चालू कर सकते हैं, ताकि उन्हें टीवी, फ़ोन, और टैबलेट पर Google TV के अनुभव में, काम के कॉन्टेंट के सुझाव मिल सकें.
ज़रूरी शर्तें
डिवाइस के एनटाइटलमेंट एपीआई का इस्तेमाल करने से पहले, मीडिया ऐक्शन फ़ीड को शामिल करना ज़रूरी है. अगर आपने अब तक मीडिया ऐक्शन फ़ीड के लिए ऑप्ट-इन नहीं किया है, तो ऑप्ट-इन करें.
सेशन की तैयारी
शुरू करने से पहले, यह तरीका अपनाएं पुष्टि करें कि आपका ऐप्लिकेशन, इस इंटिग्रेशन के लिए एपीआई लेवल 19 या उसके बाद के लेवल को टारगेट करता हो
अपने ऐप्लिकेशन में
com.google.android.engage
लाइब्रेरी जोड़ें:इंटिग्रेशन में इस्तेमाल करने के लिए, अलग-अलग SDK टूल उपलब्ध हैं: एक मोबाइल ऐप्लिकेशन के लिए और दूसरा टीवी ऐप्लिकेशन के लिए.
मोबाइल के लिए
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 सेवा के एनवायरमेंट को प्रोडक्शन पर सेट करें. बेहतर परफ़ॉर्मेंस और आने वाले समय में काम करने के लिए, डेटा को सिर्फ़ तब पब्लिश करें, जब ऐप्लिकेशन फ़ोरग्राउंड में हो और उपयोगकर्ता उससे इंटरैक्ट कर रहा हो. जैसे, ऐप्लिकेशन लॉन्च करने, लॉगिन करने के बाद या ऐप्लिकेशन का इस्तेमाल करते समय. बैकग्राउंड प्रोसेस से पब्लिश करने की सुविधा का इस्तेमाल न करें.
इन इवेंट पर सदस्यता की जानकारी पब्लिश करें:
- उपयोगकर्ता आपके ऐप्लिकेशन में लॉग इन करता है.
- उपयोगकर्ता, प्रोफ़ाइलों के बीच स्विच करता है (अगर प्रोफ़ाइलें इस्तेमाल की जा सकती हैं).
- उपयोगकर्ता नई सदस्यता खरीदता है.
- उपयोगकर्ता ने अपनी मौजूदा सदस्यता अपग्रेड की हो.
- उपयोगकर्ता की सदस्यता खत्म हो जाती है.
SDK टूल इंटिग्रेशन
इस सेक्शन में, अलग-अलग तरह की सदस्यताएं मैनेज करने के लिए, 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();
Premium सदस्यता
अगर ऐप्लिकेशन में प्रीमियम सदस्यता के कई टियर वाले पैकेज उपलब्ध हैं, जिनमें सामान्य टियर के अलावा ज़्यादा कॉन्टेंट या सुविधाएं शामिल हैं, तो सदस्यता में एक या उससे ज़्यादा एनटाइटलमेंट जोड़कर इसे दिखाएं.
इस एनटाइटलमेंट में ये फ़ील्ड शामिल होते हैं:
- आइडेंटिफ़ायर: इस एनटाइटलमेंट के लिए, आइडेंटिफ़ायर स्ट्रिंग ज़रूरी है. यह, मीडिया सेवा देने वाली कंपनी के 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()
एपीआई को सही तरीके से कॉल कर रहा है या नहीं.पुष्टि करें कि डेटा, पुष्टि करने वाले ऐप्लिकेशन में दिख रहा हो. पुष्टि करने वाले ऐप्लिकेशन में, सदस्यता को एक अलग लाइन के तौर पर दिखाया जाना चाहिए. Publish API को शुरू करने पर, डेटा की पुष्टि करने वाले ऐप्लिकेशन में डेटा दिखना चाहिए.
- पुष्टि करें कि ऐप्लिकेशन की Android मेनिफ़ेस्ट फ़ाइल में, Engage Service Flag को प्रोडक्शन के लिए सेट नहीं किया गया है.
- Engage Verification ऐप्लिकेशन इंस्टॉल करें और खोलें.
- अगर पुष्टि करने वाले ऐप्लिकेशन में
isServiceAvailable
की वैल्यूfalse
है, तो इसेtrue
पर सेट करने के लिए, पुष्टि करने वाले ऐप्लिकेशन में मौजूदToggle
बटन पर क्लिक करें. - ऐप्लिकेशन के पैकेज का नाम डालें. इससे पब्लिश किया गया डेटा अपने-आप दिखता है.
ऐप्लिकेशन पर जाएं और यहां दी गई हर कार्रवाई करें:
- साइन इन करें.
- प्रोफ़ाइलों के बीच स्विच करना (अगर यह सुविधा उपलब्ध है).
- नई सदस्यता खरीदें.
- मौजूदा सदस्यता को अपग्रेड करना.
- सदस्यता खत्म करना.
इंटिग्रेशन की पुष्टि करना
अपने इंटिग्रेशन की जांच करने के लिए, का इस्तेमाल करें.
पुष्टि करने वाला ऐप्लिकेशन, एक Android ऐप्लिकेशन है. डेवलपर इसका इस्तेमाल यह पुष्टि करने के लिए कर सकते हैं कि इंटिग्रेशन काम कर रहा है. इस ऐप्लिकेशन में ऐसी सुविधाएं शामिल हैं जिनसे डेवलपर को डेटा की पुष्टि करने और ब्रॉडकास्ट इंटेंट में मदद मिलती है. इससे लॉन्च से पहले, डेटा की सटीकता और सही तरीके से काम करने की पुष्टि करने में मदद मिलती है.
- हर इवेंट के लिए, देखें कि ऐप्लिकेशन ने
publishSubscription
API को कॉल किया है या नहीं. पुष्टि करने वाले ऐप्लिकेशन में, पब्लिश किए गए डेटा की पुष्टि करें. पुष्टि करें कि पुष्टि करने वाले ऐप्लिकेशन में सब कुछ हरा है अगर सभी एंटिटी की जानकारी सही है, तो सभी एंटिटी में "ठीक है" वाला हरे रंग का सही का निशान दिखता है.
पहली इमेज. सदस्यता ली गई पुष्टि करने वाले ऐप्लिकेशन में भी समस्याओं को हाइलाइट किया जाता है
दूसरी इमेज.सदस्यता नहीं ली जा सकी बंडल की गई सदस्यता में मौजूद समस्याएं देखने के लिए, टीवी रिमोट का इस्तेमाल करके बंडल की गई उस सदस्यता पर फ़ोकस करें. इसके बाद, समस्याएं देखने के लिए क्लिक करें. ऐसा हो सकता है कि आपको पहले लाइन पर फ़ोकस करना पड़े. इसके बाद, बंडल की गई सदस्यता वाला कार्ड ढूंढने के लिए, दाईं ओर जाएं. समस्याओं को लाल रंग से हाइलाइट किया गया है, जैसा कि तीसरी इमेज में दिखाया गया है. इसके अलावा, बंडल की गई सदस्यता में एनटाइटलमेंट से जुड़ी समस्याएं देखने के लिए, रिमोट का इस्तेमाल करके नीचे जाएं
तीसरी इमेज.सदस्यता से जुड़ी गड़बड़ियां एनटाइटलमेंट से जुड़ी समस्याएं देखने के लिए, टीवी रिमोट का इस्तेमाल करके उस एनटाइटलमेंट पर फ़ोकस करें और समस्याएं देखने के लिए क्लिक करें. समस्याओं को लाल रंग में हाइलाइट किया गया है.
चौथी इमेज.सदस्यता से जुड़ी गड़बड़ी की जानकारी
डाउनलोड करें
डाउनलोड करने से पहले, आपको नीचे दी गई शर्तों को स्वीकार करना होगा.