এই গাইডে Engage SDK ব্যবহার করে Google TV-র সাথে অ্যাপ সাবস্ক্রিপশন এবং এনটাইটেলমেন্ট ডেটা শেয়ার করার জন্য ডেভেলপারদের জন্য নির্দেশাবলী রয়েছে। ব্যবহারকারীরা টিভি, মোবাইল ও ট্যাবলেটে Google TV-র অভিজ্ঞতার মধ্যে সরাসরি, তাদের জন্য উপযুক্ত কন্টেন্ট খুঁজে পেতে এবং Google TV-কে অত্যন্ত প্রাসঙ্গিক কন্টেন্ট সাজেশন ব্যবহারকারীদের কাছে পৌঁছে দিতে সক্ষম করতে পারেন।
পূর্বশর্ত
ডিভাইস এনটাইটেলমেন্ট API ব্যবহার করার আগে মিডিয়া অ্যাকশন ফিড অনবোর্ড করতে হবে। আপনি আগে থেকে এটি না করে থাকলে, মিডিয়া অ্যাকশন ফিড অনবোর্ডিং প্রসেস সম্পূর্ণ করুন।
প্রি-ওয়ার্ক
শুরু করার নির্দেশিকায় কাজের আগে সংক্রান্ত নির্দেশাবলী সম্পূর্ণ করুন।
- নিম্নলিখিত ইভেন্টে সাবস্ক্রিপশন সংক্রান্ত তথ্য প্রকাশ করুন:
- ব্যবহারকারী আপনার অ্যাপে লগ-ইন করেন।
- ব্যবহারকারী প্রোফাইল পরিবর্তন করেন (প্রোফাইল কাজ করলে)।
- ব্যবহারকারী নতুন সাবস্ক্রিপশন কেনেন।
- ব্যবহারকারী আগে থেকে থাকা সাবস্ক্রিপশন আপগ্রেড করেন।
- ব্যবহারকারীর সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে যায়।
ইন্টিগ্রেশন
এই বিভাগে বিভিন্ন সাবস্ক্রিপশনের ধরন ম্যানেজ করার জন্য SubscriptionEntity প্রয়োগ করার প্রয়োজনীয় কোডের উদাহরণ ও নির্দেশাবলী দেওয়া হয়েছে।
কমন টিয়ার সাবস্ক্রিপশন
মিডিয়া প্রদানকারী পরিষেবার বেসিক সাবস্ক্রিপশন নেওয়া ব্যবহারকারীদের জন্য, যেমন, এমন পরিষেবা যার একটি সাবস্ক্রিপশন টিয়ার আছে যা সব পেড কন্টেন্টে অ্যাক্সেস দেয়, এইসব প্রয়োজনীয় বিবরণ প্রদান করুন:
SubscriptionType: ব্যবহারকারীর নির্দিষ্ট সাবস্ক্রিপশন প্ল্যান স্পষ্টভাবে উল্লেখ করুন।SUBSCRIPTION_TYPE_ACTIVE: ব্যবহারকারীর অ্যাক্টিভ পেড সাবস্ক্রিপশন আছে।SUBSCRIPTION_TYPE_ACTIVE_TRIAL: ব্যবহারকারীর ট্রায়াল সাবস্ক্রিপশন আছে।SUBSCRIPTION_TYPE_INACTIVE: ব্যবহারকারীর অ্যাকাউন্ট আছে কিন্তু কোনও অ্যাক্টিভ সাবস্ক্রিপশন বা ট্রায়াল নেই।
ExpirationTimeMillis: মিলিসেকেন্ডে ঐচ্ছিক সময়। সাবস্ক্রিপশনের মেয়াদ কখন শেষ হবে তা উল্লেখ করুন।ProviderPackageName: সাবস্ক্রিপশন ম্যানেজ করে এমন অ্যাপের প্যাকেজের নাম উল্লেখ করুন।
স্যাম্পেল মিডিয়া প্রদানকারীর ফিডের উদাহরণ।
"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()
প্রিমিয়াম সাবস্ক্রিপশন
অ্যাপে যদি মাল্টি-টিয়ার প্রিমিয়াম সাবস্ক্রিপশন প্যাকেজ অফার করা হয়, যার মধ্যে সাধারণ টিয়ারের থেকে বেশি কন্টেন্ট বা ফিচার অন্তর্ভুক্ত থাকে, তাহলে সাবস্ক্রিপশনে এক বা একাধিক এনটাইটেলমেন্ট যোগ করে এটি দেখান।
এই এনটাইটেলমেন্টে নিম্নলিখিত ফিল্ড আছে:
Identifier: এই এনটাইটেলমেন্টের জন্য প্রয়োজনীয় শনাক্তকারী স্ট্রিং। এটি Google TV-তে প্রকাশিত মিডিয়া প্রদানকারীর ফিডে দেওয়া এনটাইটেলমেন্ট শনাক্তকারী-এর (মনে রাখবেন যে এটি ID ফিল্ড নয়) সাথে মিলতে হবে।Name: এটি হল সহায়ক তথ্য এবং এনটাইটেলমেন্ট ম্যাচ করার জন্য ব্যবহার করা হয়। ঐচ্ছিক হলেও, মানুষের-পঠনযোগ্য এনটাইটেলমেন্টের নাম প্রদান করলে, ডেভেলপার এবং সহায়তা টিম, উভয়ের জন্যই ব্যবহারকারীর এনটাইটেলমেন্ট বোঝা সহজ হয়। যেমন: Sling Orange.ExpirationTimeMillis: সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার সময়ের থেকে আলাদা হলে, এই এনটাইটেলমেন্টের মেয়াদ শেষ হওয়ার সময় মিলি সেকেন্ডে উল্লেখ করুন। ডিফল্ট হিসেবে, সাবস্ক্রিপশনের মেয়াদ শেষ হওয়ার সাথে সাথে এনটাইটেলমেন্টের মেয়াদও শেষ হয়ে যাবে।
নিচে দেওয়া মিডিয়া প্রদানকারীর ফিড স্নিপেটের স্যাম্পেল দেখুন:
"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 = SubscriptionEntity.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() পদ্ধতি ব্যবহার করুন।
শুরু করার নির্দেশিকা-তে যেমন বলা আছে সেই অনুযায়ী ক্লায়েন্ট শুরু করা এবং পরিষেবার উপলভ্যতা চেক করার বিষয়টি নিশ্চিত করুন।
client.publishSubscription(
PublishSubscriptionRequest.Builder()
.setAccountProfile(accountProfile)
.setSubscription(subscription)
.build()
)
ব্যবহারকারীর কাছে পরিষেবার জন্য শুধুমাত্র একটি সাবস্ক্রিপশন আছে কিনা তা যাচাই করতে setSubscription() ব্যবহার করুন।
ব্যবহারকারীকে শূন্য বা তার বেশি লিঙ্ক করা সাবস্ক্রিপশন রাখার সুবিধা দিতে, addLinkedSubscription() বা addLinkedSubscriptions() ব্যবহার করুন যা লিঙ্ক করা সাবস্ক্রিপশনের তালিকা গ্রহণ করে।
পরিষেবাটি অনুরোধ পেলে, একটি নতুন এন্ট্রি তৈরি করা হয় এবং ৬০ দিন পরে পুরনো এন্ট্রিটি অটোমেটিক মুছে ফেলা হয়। সিস্টেম সবসময় লেটেস্ট এন্ট্রি ব্যবহার করে। কোনও সমস্যা হলে, সম্পূর্ণ অনুরোধ বাতিল করা হয় এবং বর্তমান স্ট্যাটাস বজায় রাখা হয়।
সাবস্ক্রিপশন আপ-টু-ডেট রাখুন
পরিবর্তন হলে সাথে সাথে আপডেট দিতে, ব্যবহারকারীর সাবস্ক্রিপশন স্ট্যাটাস পরিবর্তন হলে, যেমন অ্যাক্টিভেশন, ডিঅ্যাক্টিভেশন, আপগ্রেড, ডাউনগ্রেড,
publishSubscriptionCluster-এ কল করুন।চলমান নির্ভুলতার জন্য নিয়মিত যাচাইকরণ প্রদান করতে, প্রতি মাসে অন্তত একবার
publishSubscriptionCluster-এ কল করুন।Engage ডেটা মুছে ফেলতে, ৬০ দিনের স্ট্যান্ডার্ড রিটেনশন পিরিয়ডের আগে Google TV সার্ভার থেকে ব্যবহারকারীর ডেটা ম্যানুয়ালি মুছে ফেলতে,
client.deleteClustersপদ্ধতি ব্যবহার করুন। এটি অ্যাকাউন্ট প্রোফাইল বা সম্পূর্ণ অ্যাকাউন্টের জন্য আগে থেকে থাকা সব Engage ডেটা মুছে দেয়, যা নির্ভর করে প্রদত্তDeleteReason-এর উপর।নিম্নলিখিত কোড স্নিপেট থেকে জানা যায় যে কীভাবে ব্যবহারকারীর সাবস্ক্রিপশন সরানো যায়:
// If the user logs out from your media app, you must make the following call // to remove subscription and other Engage data from the current // google TV device. client.deleteClusters( DeleteClustersRequest.Builder() .setAccountProfile(accountProfile) .setDeleteReason(DeleteReason.DELETE_REASON_USER_LOG_OUT) .build() )ব্যবহারকারী সম্মতি প্রত্যাহার করলে, নিম্নলিখিত কোড স্নিপেট ব্যবহারকারীর সাবস্ক্রিপশন সরিয়ে দেওয়ার বিষয়টি দেখায়:
// If the user revokes the consent to share across device, make the call // to remove subscription and other Engage data from all google // TV devices. client.deleteClusters( DeleteClustersRequest.Builder() .setAccountProfile(accountProfile) .setDeleteReason(DeleteReason.DELETE_REASON_LOSS_OF_CONSENT) .build() )ব্যবহারকারীর প্রোফাইল মুছে দেওয়ার সময় সাবস্ক্রিপশন ডেটা কীভাবে সরাতে হয় তা নিম্নলিখিত কোড থেকে বোঝা যায়।
// If the user delete a specific profile, you must make the following call // to remove subscription data and other Engage data. client.deleteClusters( DeleteClustersRequest.Builder() .setAccountProfile(accountProfile) .setDeleteReason(DeleteReason.DELETE_REASON_ACCOUNT_PROFILE_DELETION) .build() )
পরীক্ষা করা
এই বিভাগে সাবস্ক্রিপশন প্রয়োগ পরীক্ষা করার জন্য ধাপে-ধাপে গাইড দেওয়া হয়েছে। লঞ্চ করার আগে ডেটার নির্ভুলতা এবং সঠিক কার্যকারিতা যাচাই করুন।
ইন্টিগ্রেশন চেকলিস্ট প্রকাশ করুন
অ্যাপ ফোরগ্রাউন্ডে থাকলে এবং ব্যবহারকারী সেটির সাথে অ্যাক্টিভভাবে ইন্টার্যাক্ট করলে, তবেই প্রকাশ করা উচিত।
কখন প্রকাশ করা হবে:
- ব্যবহারকারী প্রথমবার লগ-ইন করেন।
- ব্যবহারকারী প্রোফাইল পরিবর্তন করেন (যদি প্রোফাইল কাজ করে)।
- ব্যবহারকারী নতুন সাবস্ক্রিপশন কেনেন।
- ব্যবহারকারী সাবস্ক্রিপশন আপগ্রেড করেন।
- ব্যবহারকারীর সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে যায়।
অ্যাপটি সঠিকভাবে
isServiceAvailableএবংpublishClustersAPI-কে logcat-এ, ইভেন্ট প্রকাশ করার সময় কল করছে কিনা তা চেক করুন।যাচাইকরণ অ্যাপে ডেটা দেখা যাচ্ছে কিনা তা যাচাই করুন। যাচাইকরণ অ্যাপে সাবস্ক্রিপশন আলাদা সারিতে দেখানো উচিত। প্রকাশ করার API ইনভোক করা হলে, যাচাইকরণ অ্যাপে ডেটা দেখানো উচিত।
অ্যাপে যান এবং নিম্নলিখিত প্রতিটি অ্যাকশন পারফর্ম করুন:
- সাইন-ইন করুন।
- প্রোফাইল পরিবর্তন করা (যদি কাজ করে)।
- নতুন সাবস্ক্রিপশন কেনা।
- আগে থেকে থাকা সাবস্ক্রিপশন আপগ্রেড করা।
- সাবস্ক্রিপশনের মেয়াদ শেষ করুন।
ইন্টিগ্রেশন যাচাই করুন
আপনার ইন্টিগ্রেশন পরীক্ষা করতে, যাচাইকরণ অ্যাপ ব্যবহার করুন।
- প্রতিটি ইভেন্টের জন্য, অ্যাপ
publishSubscriptionAPI চালু করেছে কিনা তা চেক করুন। যাচাইকরণ অ্যাপে প্রকাশিত ডেটা যাচাই করুন। যাচাইকরণ অ্যাপে সবকিছু সবুজ আছে কিনা তা যাচাই করুন সব এন্টিটির তথ্য সঠিক হলে, সব এন্টিটিতে "সব ঠিক আছে" লেখা সবুজ চেক চিহ্ন দেখায়।
ছবি ১. সাবস্ক্রিপশন সম্পূর্ণ হয়েছে যাচাইকরণ অ্যাপেও সমস্যা হাইলাইট করা হয়
ছবি ২.সাবস্ক্রিপশন করা যায়নি বান্ডেল সাবস্ক্রিপশনে সমস্যা দেখতে, টিভির রিমোট ব্যবহার করে সেই নির্দিষ্ট বান্ডেল সাবস্ক্রিপশনে ফোকাস করুন এবং সমস্যা দেখতে ক্লিক করুন। আপনাকে প্রথমে সারিতে ফোকাস করতে হতে পারে এবং বান্ডেল সাবস্ক্রিপশন কার্ড খুঁজতে ডানদিকে যেতে হতে পারে। ছবি ৩-এ যেমন দেখানো হয়েছে, সমস্যাগুলি লাল রঙে হাইলাইট করা হয়েছে। এছাড়াও, বান্ডেল সাবস্ক্রিপশনের মধ্যে এনটাইটেলমেন্টে সমস্যা দেখতে রিমোট ব্যবহার করে নিচে যান
ছবি ৩.সাবস্ক্রিপশন সংক্রান্ত সমস্যা এনটাইটেলমেন্টে সমস্যা দেখতে, টিভি রিমোট ব্যবহার করে সেই নির্দিষ্ট এনটাইটেলমেন্টে ফোকাস করুন এবং সমস্যা দেখতে ক্লিক করুন। সমস্যাগুলি লাল রঙে হাইলাইট করা হয়েছে।
ছবি ৪.সাবস্ক্রিপশন সংক্রান্ত সমস্যার বিবরণ