Engage SDK ব্যবহার করে Google TV-এর সাথে অ্যাপ এনটাইটেলমেন্ট শেয়ার করুন

এই নির্দেশিকায় ডেভেলপারদের জন্য Engage SDK ব্যবহার করে Google TV-এর সাথে অ্যাপ সাবস্ক্রিপশন এবং এনটাইটেলমেন্ট ডেটা শেয়ার করার নির্দেশনা রয়েছে। ব্যবহারকারীরা টিভি, মোবাইল এবং ট্যাবলেটে সরাসরি Google TV অভিজ্ঞতার মধ্যেই তাদের প্রাপ্য কন্টেন্ট খুঁজে নিতে পারেন এবং ব্যবহারকারীদের কাছে অত্যন্ত প্রাসঙ্গিক কন্টেন্টের সুপারিশ পৌঁছে দেওয়ার জন্য Google TV-কে সক্ষম করতে পারেন।

পূর্বশর্ত

ডিভাইস এনটাইটেলমেন্ট এপিআই ব্যবহার করার আগে মিডিয়া অ্যাকশন ফিড অনবোর্ডিং করা আবশ্যক। আপনি যদি এখনও তা না করে থাকেন, তাহলে মিডিয়া অ্যাকশন ফিড অনবোর্ডিং প্রক্রিয়াটি সম্পূর্ণ করুন।

প্রাক-কাজ

'Getting Started' গাইডে দেওয়া প্রাক-কাজের নির্দেশাবলী সম্পূর্ণ করুন।

  1. নিম্নলিখিত ইভেন্টগুলিতে সাবস্ক্রিপশনের তথ্য প্রকাশ করুন:
    1. ব্যবহারকারী আপনার অ্যাপে লগ ইন করেন।
    2. ব্যবহারকারী প্রোফাইল পরিবর্তন করতে পারে (যদি প্রোফাইল সমর্থিত হয়)।
    3. ব্যবহারকারী একটি নতুন সাবস্ক্রিপশন কেনেন।
    4. ব্যবহারকারী একটি বিদ্যমান সাবস্ক্রিপশন আপগ্রেড করেন।
    5. ব্যবহারকারীর সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেছে।

একীকরণ

এই বিভাগে বিভিন্ন ধরনের সাবস্ক্রিপশন পরিচালনা করার জন্য SubscriptionEntity বাস্তবায়নের প্রয়োজনীয় কোড উদাহরণ এবং নির্দেশাবলী প্রদান করা হয়েছে।

সাধারণ স্তরের সাবস্ক্রিপশন

যেসব ব্যবহারকারীর মিডিয়া প্রদানকারী পরিষেবার বেসিক সাবস্ক্রিপশন রয়েছে, উদাহরণস্বরূপ এমন কোনো পরিষেবার ক্ষেত্রে যেখানে একটিমাত্র সাবস্ক্রিপশন স্তর সমস্ত পেইড কন্টেন্টে অ্যাক্সেস দেয়, তাদের জন্য এই অপরিহার্য বিবরণগুলো প্রদান করুন:

  1. SubscriptionType : ব্যবহারকারীর নির্দিষ্ট সাবস্ক্রিপশন প্ল্যানটি স্পষ্টভাবে উল্লেখ করুন।

    • SUBSCRIPTION_TYPE_ACTIVE : ব্যবহারকারীর একটি সক্রিয় অর্থপ্রদত্ত সাবস্ক্রিপশন আছে।
    • SUBSCRIPTION_TYPE_ACTIVE_TRIAL : ব্যবহারকারীর একটি ট্রায়াল সাবস্ক্রিপশন আছে।
    • SUBSCRIPTION_TYPE_INACTIVE : ব্যবহারকারীর একটি অ্যাকাউন্ট আছে কিন্তু কোনো সক্রিয় সাবস্ক্রিপশন বা ট্রায়াল নেই।
  2. ExpirationTimeMillis : মিলিসেকেন্ডে ঐচ্ছিক সময়। সাবস্ক্রিপশনটি কখন মেয়াদোত্তীর্ণ হবে তা নির্দিষ্ট করুন।

  3. 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()

প্রিমিয়াম সাবস্ক্রিপশন

যদি অ্যাপটি একাধিক স্তরের প্রিমিয়াম সাবস্ক্রিপশন প্যাকেজ অফার করে, যেগুলিতে সাধারণ স্তরের বাইরেও অতিরিক্ত কন্টেন্ট বা ফিচার অন্তর্ভুক্ত থাকে, তাহলে সাবস্ক্রিপশনে এক বা একাধিক এনটাইটেলমেন্ট যোগ করে তা উপস্থাপন করুন।

এই অধিকারটিতে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

  1. Identifier : এই এনটাইটেলমেন্টের জন্য প্রয়োজনীয় শনাক্তকারী স্ট্রিং। এটি অবশ্যই মিডিয়া প্রোভাইডারের গুগল টিভিতে প্রকাশিত ফিডে দেওয়া এনটাইটেলমেন্ট শনাক্তকারীগুলোর (উল্লেখ্য যে, এটি আইডি ফিল্ড নয়) একটির সাথে মিলতে হবে।
  2. Name : এটি একটি সহায়ক তথ্য এবং এটি এনটাইটেলমেন্ট মেলানোর জন্য ব্যবহৃত হয়। যদিও এটি ঐচ্ছিক, একটি সহজে পঠনযোগ্য এনটাইটেলমেন্ট নাম প্রদান করলে ডেভেলপার এবং সাপোর্ট টিম উভয়ের জন্যই ব্যবহারকারীর এনটাইটেলমেন্ট বোঝা সহজ হয়। উদাহরণস্বরূপ: স্লিং অরেঞ্জ।
  3. 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 = 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() মেথডটি ব্যবহার করুন।

গেটিং স্টার্টেড গাইডে বর্ণিত পদ্ধতি অনুযায়ী ক্লায়েন্ট ইনিশিয়ালাইজ করুন এবং সার্ভিসের প্রাপ্যতা যাচাই করে নিন।

client.publishSubscription(
  PublishSubscriptionRequest.Builder()
    .setAccountProfile(accountProfile)
    .setSubscription(subscription)
    .build()
  )

ব্যবহারকারীর পরিষেবাটিতে কেবল একটিই সাবস্ক্রিপশন আছে, তা যাচাই করতে setSubscription() ব্যবহার করুন।

ব্যবহারকারীকে শূন্য বা তার বেশি লিঙ্ক করা সাবস্ক্রিপশন রাখার সুযোগ দিতে, addLinkedSubscription() অথবা addLinkedSubscriptions() (যা লিঙ্ক করা সাবস্ক্রিপশনের একটি তালিকা গ্রহণ করে) ব্যবহার করুন।

পরিষেবাটি অনুরোধটি গ্রহণ করলে একটি নতুন এন্ট্রি তৈরি হয় এবং পুরোনো এন্ট্রিটি ৬০ দিন পর স্বয়ংক্রিয়ভাবে মুছে যায়। সিস্টেমটি সর্বদা সর্বশেষ এন্ট্রিটি ব্যবহার করে। কোনো ত্রুটির ক্ষেত্রে, সম্পূর্ণ অনুরোধটি প্রত্যাখ্যান করা হয় এবং বিদ্যমান অবস্থা বজায় রাখা হয়।

সাবস্ক্রিপশন আপ-টু-ডেট রাখুন

  1. কোনো ব্যবহারকারীর সাবস্ক্রিপশনের অবস্থা যেমন অ্যাক্টিভেশন, ডিঅ্যাক্টিভেশন, আপগ্রেড বা ডাউনগ্রেড হলে, পরিবর্তন সম্পর্কে তাৎক্ষণিক আপডেট দেওয়ার জন্য publishSubscriptionCluster কল করুন।

  2. চলমান নির্ভুলতা নিয়মিত যাচাই করার জন্য, প্রতি মাসে অন্তত একবার publishSubscriptionCluster কল করুন।

  3. Engage ডেটা মুছে ফেলতে, সাধারণ ৬০-দিনের ডেটা সংরক্ষণের মেয়াদের আগে Google TV সার্ভার থেকে কোনো ব্যবহারকারীর ডেটা ম্যানুয়ালি ডিলিট করতে client.deleteClusters মেথডটি ব্যবহার করুন। এটি প্রদত্ত DeleteReason উপর নির্ভর করে অ্যাকাউন্ট প্রোফাইলের অথবা সম্পূর্ণ অ্যাকাউন্টের সমস্ত বিদ্যমান Engage ডেটা মুছে দেয়।

    নিম্নলিখিত কোড স্নিপেটটি দেখায় কিভাবে একজন ব্যবহারকারীর সাবস্ক্রিপশন বাতিল করতে হয়:

    // 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(
      new DeleteClustersRequest.Builder()
        .setAccountProfile(accountProfile)
      .setReason(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(
      new DeleteClustersRequest.Builder()
        .setAccountProfile(accountProfile)
        .setReason(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(
      new DeleteClustersRequest.Builder()
      .setAccountProfile(accountProfile)
      .setReason(DeleteReason.DELETE_REASON_ACCOUNT_PROFILE_DELETION)
      .build()
    )
    

পরীক্ষা

এই বিভাগে সাবস্ক্রিপশন বাস্তবায়ন পরীক্ষা করার জন্য একটি ধাপে ধাপে নির্দেশিকা দেওয়া হয়েছে। চালু করার আগে ডেটার নির্ভুলতা এবং সঠিক কার্যকারিতা যাচাই করুন।

প্রকাশনা ইন্টিগ্রেশন চেকলিস্ট

  1. অ্যাপটি যখন ফোরগ্রাউন্ডে থাকবে এবং ব্যবহারকারী সক্রিয়ভাবে এটির সাথে ইন্টারঅ্যাক্ট করবে, তখনই পাবলিশিং হওয়া উচিত।

  2. কখন প্রকাশ করবেন:

    • ব্যবহারকারী প্রথমবার লগ ইন করেন।
    • ব্যবহারকারী প্রোফাইল পরিবর্তন করে (যদি প্রোফাইল সমর্থিত হয়)।
    • ব্যবহারকারী নতুন সাবস্ক্রিপশন কেনেন।
    • ব্যবহারকারী সাবস্ক্রিপশন আপগ্রেড করেন।
    • ব্যবহারকারীর সাবস্ক্রিপশনের মেয়াদ শেষ হয়ে গেছে।
  3. পাবলিশিং ইভেন্টগুলোতে অ্যাপটি isServiceAvailable() এবং publishClusters() এপিআইগুলো সঠিকভাবে কল করছে কিনা, তা লগক্যাটে পরীক্ষা করে দেখুন।

  4. যাচাই করুন যে ডেটা ভেরিফিকেশন অ্যাপে দেখা যাচ্ছে। ভেরিফিকেশন অ্যাপে সাবস্ক্রিপশনটি একটি আলাদা সারি হিসেবে প্রদর্শিত হওয়া উচিত। যখন পাবলিশ এপিআই কল করা হবে, তখন ডেটা ভেরিফিকেশন অ্যাপে দেখা যাবে।

  5. অ্যাপে যান এবং নিম্নলিখিত প্রতিটি কাজ সম্পাদন করুন:

    • সাইন ইন করুন।
    • প্রোফাইলগুলির মধ্যে পরিবর্তন করুন (যদি সমর্থিত হয়)।
    • একটি নতুন সাবস্ক্রিপশন কিনুন।
    • বিদ্যমান সাবস্ক্রিপশন আপগ্রেড করুন।
    • সাবস্ক্রিপশনের মেয়াদ শেষ করুন।

ইন্টিগ্রেশন যাচাই করুন

আপনার ইন্টিগ্রেশন পরীক্ষা করতে, ভেরিফিকেশন অ্যাপটি ব্যবহার করুন।

  1. প্রতিটি ইভেন্টের জন্য, অ্যাপটি publishSubscription API কল করেছে কিনা তা পরীক্ষা করুন। ভেরিফিকেশন অ্যাপে প্রকাশিত ডেটা যাচাই করুন। ভেরিফিকেশন অ্যাপে সবকিছু সবুজ আছে কিনা তা যাচাই করুন।
  2. যদি সত্তাটির সমস্ত তথ্য সঠিক থাকে, তাহলে সমস্ত সত্তাতেই একটি "সব ঠিক আছে" সবুজ টিক চিহ্ন দেখানো হয়।

    যাচাইকরণ অ্যাপ সফলতার স্ক্রিনশট
    চিত্র ১. সফল সাবস্ক্রিপশন
  3. যাচাইকরণ অ্যাপেও সমস্যাগুলো তুলে ধরা হয়েছে।

    যাচাইকরণ অ্যাপের ত্রুটির স্ক্রিনশট
    চিত্র ২. সাবস্ক্রিপশন অসফল
  4. বান্ডেল সাবস্ক্রিপশনের সমস্যাগুলো দেখতে, টিভি রিমোট ব্যবহার করে নির্দিষ্ট বান্ডেল সাবস্ক্রিপশনটির উপর ফোকাস করুন এবং সমস্যাগুলো দেখার জন্য ক্লিক করুন। বান্ডেল সাবস্ক্রিপশন কার্ডটি খুঁজে পেতে আপনাকে প্রথমে সারিটির উপর ফোকাস করে ডানদিকে যেতে হতে পারে। চিত্র ৩-এ দেখানো অনুযায়ী, সমস্যাগুলো লাল রঙে হাইলাইট করা থাকে। এছাড়াও, বান্ডেল সাবস্ক্রিপশনের অন্তর্ভুক্ত এনটাইটেলমেন্টগুলোর সমস্যা দেখতে রিমোট ব্যবহার করে নিচের দিকে যান।

    যাচাইকরণ অ্যাপের ত্রুটির বিস্তারিত স্ক্রিনশট
    চিত্র ৩. সাবস্ক্রিপশন ত্রুটি
  5. প্রাপ্যতার সমস্যাগুলো দেখতে, টিভি রিমোট ব্যবহার করে নির্দিষ্ট প্রাপ্যতার উপর ফোকাস করুন এবং সমস্যাগুলো দেখার জন্য ক্লিক করুন। সমস্যাগুলো লাল রঙে হাইলাইট করা থাকে।

    যাচাইকরণ অ্যাপের ত্রুটির স্ক্রিনশট
    চিত্র ৪. সাবস্ক্রিপশন ত্রুটির বিবরণ