ব্যবহারকারীরা যেখানে আছেন সেখানে তাদের কাছে পৌঁছে অ্যাপ এনগেজমেন্ট বুস্ট করুন। Engage SDK ইন্টিগ্রেট করুন যাতে একাধিক অন-ডিভাইস সারফেস জুড়ে ব্যবহারকারীদের সরাসরি পছন্দমতো সাজেশন এবং কন্টিনিউয়েশন কন্টেন্ট ডেলিভার করা যায়, যেমন কালেকশন, Entertainment Space এবং Play Store। ইন্টিগ্রেশনটি গড় APK-তে ৫০ কেবি (কমপ্রেস করা) থেকে কম যোগ করে এবং বেশিরভাগ অ্যাপের ক্ষেত্রে ডেভেলপারের প্রায় এক সপ্তাহ সময় নেয়। আমাদের ব্যবসার সাইট থেকে আরও জানুন।
এই গাইডে ডেভেলপার পার্টনারদের জন্য Engage কন্টেন্ট সারফেসে সোশ্যাল মিডিয়া কন্টেন্ট ডেলিভার করার নির্দেশাবলী রয়েছে।
বিভাগ সংক্রান্ত সহায়তা ও সারফেস
Engage SDK সারফেসের উপযুক্ততা আপনার অ্যাপের কন্টেন্ট বিভাগের উপর নির্ভর করে। নির্দিষ্ট সারফেসে আপনার যোগ্যতা নির্ধারণ করতে নিম্নলিখিত টেবিল ব্যবহার করুন:
| স্ট্যাটাস | কন্টেন্ট বিভাগ বা ব্যবহারিক প্রয়োগ | যেসব সারফেসে কাজ করে |
|---|---|---|
|
কাজ করে (সব সারফেসে উপযুক্ত) |
|
|
| কাজ করে না |
|
Android স্কিল
GitHub-এ দেখুনEngage SDK ইন্টিগ্রেট করা
android skills add engage-sdk-integrationইন্টিগ্রেশনের বিবরণ
নিম্নলিখিত বিভাগে ইন্টিগ্রেশনের বিবরণ ক্যাপচার করা হয়।
পরিভাষা
সাজেশন ক্লাস্টার কোনও একজন ডেভেলপার পার্টনারের থেকে পছন্দমতো সাজেশন দেখায়।
আপনার সাজেশন নিম্নলিখিত স্ট্রাকচার অনুযায়ী তৈরি হয়:
সাজেশন ক্লাস্টার: UI ভিউ যাতে একই ডেভেলপার পার্টনারের থেকে পাওয়া সাজেশনের গ্রুপ থাকে।
প্রতিটি সাজেশন ক্লাস্টারে নিম্নলিখিত দুই ধরনের এন্টিটির মধ্যে একটি থাকে :
- PortraitMediaEntity
- SocialPostEntity
PortraitMediaEntity-তে পোস্টের জন্য ১টি পোর্ট্রেট ছবি থাকতেই হবে। প্রোফাইল এবং ইন্টার্যাকশন সম্পর্কিত মেটাডেটা ঐচ্ছিক।
পোস্ট করুন
- পোর্ট্রেট মোডে ছবি ও টাইমস্ট্যাম্প, অথবা
- পোর্ট্রেট মোডে ছবি + টেক্সট কন্টেন্ট ও টাইমস্ট্যাম্প
প্রোফাইল
- অবতার, নাম বা হ্যান্ডেল, অতিরিক্ত ছবি
ইন্টার্যাকশন
- শুধুমাত্র গণনা ও লেবেল, অথবা
- গণনা ও ভিজ্যুয়াল (আইকন)
SocialPostEntity-তে প্রোফাইল, পোস্ট ও ইন্টার্যাকশন সম্পর্কিত মেটাডেটা থাকে।
প্রোফাইল
- অবতার, নাম বা হ্যান্ডেল, অতিরিক্ত টেক্সট, অতিরিক্ত ছবি
পোস্ট করুন
- টেক্সট ও টাইমস্ট্যাম্প, অথবা
- রিচ মিডিয়া (ছবি বা রিচ URL) এবং টাইমস্ট্যাম্প, অথবা
- টেক্সট ও রিচ মিডিয়া (ছবি বা রিচ URL) এবং টাইমস্ট্যাম্প, অথবা
- ভিডিও প্রিভিউ (থাম্বনেল ও সময়সীমা) এবং টাইমস্ট্যাম্প
ইন্টার্যাকশন
- শুধু গণনা ও লেবেল করা, অথবা
- গণনা ও ভিজ্যুয়াল (আইকন)
প্রি-ওয়ার্ক
ন্যূনতম API লেভেল: ১৯
আপনার অ্যাপে com.google.android.engage:engage-core লাইব্রেরি যোগ করুন:
dependencies {
// Make sure you also include that repository in your project's build.gradle file.
implementation 'com.google.android.engage:engage-core:1.6.0'
}
সারাংশ
ডিজাইনটি বাউন্ড পরিষেবার প্রয়োগের উপর ভিত্তি করে তৈরি করা হয়েছে।
ক্লায়েন্ট যে ডেটা প্রকাশ করতে পারে তা বিভিন্ন ক্লাস্টার ধরনের জন্য নিম্নলিখিত সীমার অধীন:
| ক্লাস্টারের ধরন | ক্লাস্টারের সীমা | একটি ক্লাস্টারে এন্টিটির ন্যূনতম সীমা | একটি ক্লাস্টারে সর্বাধিক এন্টিটি সীমা |
|---|---|---|---|
| সাজেশন ক্লাস্টার | সর্বাধিক ৭টি | কমপক্ষে ১টি (PortraitMediaEntity, অথবা
SocialPostEntity) |
সর্বাধিক ৫০ (PortraitMediaEntity, অথবা
SocialPostEntity) |
ধাপ ১: এন্টিটি ডেটা প্রদান করুন
প্রতিটি আইটেমের ধরন দেখানোর জন্য SDK-তে বিভিন্ন এন্টিটি সংজ্ঞায়িত করা আছে। SDK সোশ্যাল ক্যাটেগরির জন্য নিম্নলিখিত এন্টিটি সাপোর্ট করে:
PortraitMediaEntitySocialPostEntity
নিম্নলিখিত চার্টে প্রতিটি ধরনের জন্য উপলভ্য অ্যাট্রিবিউট ও প্রয়োজনীয়তার আউটলাইন দেওয়া আছে।
PortraitMediaEntity
| অ্যাট্রিবিউট | প্রয়োজনীয়তা | বর্ণনা | ফর্ম্যাট |
|---|---|---|---|
| অ্যাকশন URI | Google TV ছাড়া অন্য সব সারফেসের জন্য প্রয়োজনীয় |
প্রদানকারীর অ্যাপে এন্টিটির ডিপ লিঙ্ক। মনে রাখবেন: অ্যাট্রিবিউশনের জন্য আপনি ডিপ লিঙ্ক ব্যবহার করতে পারবেন। এই প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন |
URI |
| PlatformSpecificPlayback | Google TV সারফেসের জন্য প্রয়োজনীয় |
Google TV এবং মোবাইলের মতো প্ল্যাটফর্মের জন্য প্রদানকারী অ্যাপে এন্টিটির ডিপ লিঙ্ক। |
PlatformSpecificPlayback অবজেক্টের তালিকা |
| সাজেশনের কারণ | ঐচ্ছিক | ব্যবহারকারীকে কন্টেন্ট সাজেস্ট করার যুক্তি। | RecommendationReason অবজেক্ট |
| কমেন্টের সারসংক্ষেপ | ঐচ্ছিক | পোস্টের জন্য কমেন্টের সারসংক্ষেপ। | স্ট্রিং |
| পোস্ট সম্পর্কিত মেটাডেটা (প্রয়োজনীয়) | |||
| ছবি | প্রয়োজনীয় |
ছবি পোর্ট্রেট অ্যাস্পেক্ট রেশিওতে হতে হবে। একাধিক ছবি দেওয়া হলে UI-তে শুধুমাত্র ১টি ছবি দেখানো হতে পারে। তবে, UI-তে ভিজ্যুয়াল ইঙ্গিত দেওয়া হতে পারে যে অ্যাপে আরও ছবি আছে। পোস্টটি ভিডিও হলে, ছবি হিসেবে দেখানোর জন্য প্রদানকারীকে ভিডিওর থাম্বনেল প্রদান করতে হবে। |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| টেক্সট কন্টেন্ট | ঐচ্ছিক | পোস্ট, আপডেট ইত্যাদির মূল টেক্সট। | স্ট্রিং (সর্বাধিক ১৪০টি অক্ষর সাজেস্ট করা হয়েছে) |
| টাইমস্ট্যাম্প | ঐচ্ছিক | পোস্টটি কখন প্রকাশ করা হয়েছিল। | মিলিসেকেন্ডে Epoch টাইমস্ট্যাম্প |
| ভিডিও কন্টেন্ট হলে | ঐচ্ছিক | পোস্টটি কি একটি ভিডিও? | বুলিয়ান |
| ভিডিওর সময়সীমা | ঐচ্ছিক | মিলিসেকেন্ডে ভিডিওর সময়সীমা। | দীর্ঘ |
| প্রোফাইল সম্পর্কিত মেটাডেটা (ঐচ্ছিক) | |||
| নাম | প্রয়োজনীয় | প্রোফাইলের নাম বা আইডি বা হ্যান্ডেল, যেমন "John Doe", "@TeamPixel" | স্ট্রিং(সাজেস্ট করা সর্বাধিক ২৫টি অক্ষর) |
| অবতার | প্রয়োজনীয় |
ব্যবহারকারীর প্রোফাইল ছবি বা অবতার ছবি। বর্গাকার ১:১ ছবি |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| অতিরিক্ত ছবি | ঐচ্ছিক |
প্রোফাইল ব্যাজ। যেমন - যাচাই করা ব্যাজ বর্গাকার ১:১ ছবি |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| ইন্টার্যাকশন সম্পর্কিত মেটাডেটা (ঐচ্ছিক) | |||
| সংখ্যা | ঐচ্ছিক |
ইন্টার্যাকশনের সংখ্যা উল্লেখ করুন, যেমন - "৩.৭ মিলিয়ন"। মনে রাখবেন: সংখ্যা ও সংখ্যার ভ্যালু, দুটিই দেওয়া থাকলে, সংখ্যা ব্যবহার করা হবে। মনে রাখবেন: পার্টনারদের Count অথবা CountWithOptionalLabel ব্যবহার করতে হবে। |
স্ট্রিং |
| CountWithOptionalLabel | ঐচ্ছিক |
ঐচ্ছিক লেবেল সহ ইন্টার্যাকশনের সংখ্যা উল্লেখ করুন, যেমন - "৩.৭ মিলিয়ন লাইক"। মনে রাখবেন: CountWithOptionalLabel এবং Count Value, দুটিই প্রদান করা হলে, তার মধ্যে একটি ব্যবহার করা হবে। মনে রাখবেন: পার্টনারদের Count অথবা CountWithOptionalLabel ব্যবহার করতে হবে। |
স্ট্রিং |
| কাউন্ট ভ্যালু | ঐচ্ছিক | ইন্টার্যাকশনের সংখ্যা ভ্যালু হিসেবে দেখানো হয়। মনে রাখবেন: আপনার অ্যাপ যদি বিভিন্ন ডিসপ্লে সাইজের জন্য বড় সংখ্যা কীভাবে অপ্টিমাইজ করা উচিত সেই সংক্রান্ত লজিক ম্যানেজ না করে, তাহলে Count-এর পরিবর্তে Count Value প্রদান করুন। যদি Count এবং Count Value দুটিই প্রদান করা হয়, তাহলে Count ব্যবহার করা হয়। |
দীর্ঘ |
| লেবেল | ঐচ্ছিক | ইন্টার্যাকশন লেবেলটি কীসের জন্য তা উল্লেখ করুন। যেমন - "লাইক"। | স্ট্রিং |
| ভিজ্যুয়াল | ঐচ্ছিক |
ইন্ট্যার্যাকশন কীসের জন্য তা উল্লেখ করুন। যেমন - ছবিতে লাইক আইকন, ইমোজি দেখানো হচ্ছে। ১টির বেশি ছবি দিতে পারেন, তবে সব ছবি সব ফর্ম ফ্যাক্টরে নাও দেখানো হতে পারে। মনে রাখবেন: ছবি অবশ্যই ১:১ বর্গাকার হতে হবে |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| DisplayTimeWindow (ঐচ্ছিক) - সারফেসে কন্টেন্ট দেখানোর জন্য একটি টাইম উইন্ডো সেট করুন | |||
| শুরুর টাইমস্ট্যাম্প | ঐচ্ছিক |
যে ইপক টাইমস্ট্যাম্পের পরে সারফেসে কন্টেন্ট দেখানো হবে। সেট করা না থাকলে, কন্টেন্ট সারফেসে দেখানোর উপযুক্ত হবে। |
মিলিসেকেন্ডে Epoch টাইমস্ট্যাম্প |
| শেষের টাইমস্ট্যাম্প | ঐচ্ছিক |
যে ইপক টাইমস্ট্যাম্পের পরে কন্টেন্ট আর সারফেসে দেখানো হয় না। সেট করা না থাকলে, কন্টেন্ট সারফেসে দেখানোর উপযুক্ত হবে। |
মিলিসেকেন্ডে Epoch টাইমস্ট্যাম্প |
SocialPostEntity
| অ্যাট্রিবিউট | প্রয়োজনীয়তা | বর্ণনা | ফর্ম্যাট |
|---|---|---|---|
| অ্যাকশন URI | প্রয়োজনীয় |
প্রদানকারীর অ্যাপে এন্টিটির ডিপ লিঙ্ক। মনে রাখবেন: অ্যাট্রিবিউশনের জন্য আপনি ডিপ লিঙ্ক ব্যবহার করতে পারবেন। এই প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন |
URI |
| PlatformSpecificPlayback URI | Google TV সারফেসের জন্য প্রয়োজনীয় |
Google TV এবং মোবাইলের মতো প্ল্যাটফর্মের জন্য প্রদানকারী অ্যাপে এন্টিটির ডিপ লিঙ্ক। |
PlatformSpecificPlayback অবজেক্টের তালিকা |
| সাজেশনের কারণ | ঐচ্ছিক | ব্যবহারকারীকে কন্টেন্ট সাজেস্ট করার যুক্তি। | RecommendationReason অবজেক্ট |
| কমেন্টের সারসংক্ষেপ | ঐচ্ছিক | পোস্টের জন্য কমেন্টের সারসংক্ষেপ। | স্ট্রিং |
|
পোস্ট সম্পর্কিত মেটাডেটা (প্রয়োজনীয়) TextContent, Image বা WebContent-এর মধ্যে অন্তত একটি প্রয়োজন |
|||
| ছবি | ঐচ্ছিক |
ছবি পোর্ট্রেট অ্যাস্পেক্ট রেশিওতে হতে হবে। একাধিক ছবি দেওয়া হলে UI-তে শুধুমাত্র ১টি ছবি দেখানো হতে পারে। তবে, UI-তে ভিজ্যুয়াল ইঙ্গিত দেওয়া হতে পারে যে অ্যাপে আরও ছবি আছে। পোস্টটি ভিডিও হলে, ছবি হিসেবে দেখানোর জন্য প্রদানকারীকে ভিডিওর থাম্বনেল প্রদান করতে হবে। |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| টেক্সট কন্টেন্ট | ঐচ্ছিক | পোস্ট, আপডেট ইত্যাদির মূল টেক্সট। | স্ট্রিং (সর্বাধিক ১৪০টি অক্ষর সাজেস্ট করা হয়েছে) |
| ভিডিও কন্টেন্ট (ঐচ্ছিক) | |||
| সময়সীমা | প্রয়োজনীয় | মিলিসেকেন্ডে ভিডিওর সময়সীমা। | দীর্ঘ |
| ছবি | প্রয়োজনীয় | ভিডিও কন্টেন্টের প্রিভিউ ছবি। | নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| লিঙ্ক প্রিভিউ (ঐচ্ছিক) | |||
| লিঙ্ক প্রিভিউ - শীর্ষক | প্রয়োজনীয় | ওয়েব পৃষ্ঠার কন্টেন্টের শীর্ষক বোঝাতে টেক্সট | স্ট্রিং |
| Link Preview - Hostname | প্রয়োজনীয় | ওয়েব পেজের মালিককে বোঝাতে টেক্সট, যেমন "INSIDER" | স্ট্রিং |
| লিঙ্ক প্রিভিউ - ছবি | ঐচ্ছিক | ওয়েব কন্টেন্টের জন্য অনেক বড় ছবি | নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| টাইমস্ট্যাম্প | ঐচ্ছিক | পোস্টটি কখন প্রকাশ করা হয়েছিল। | মিলিসেকেন্ডে Epoch টাইমস্ট্যাম্প |
| প্রোফাইল সম্পর্কিত মেটাডেটা (ঐচ্ছিক) | |||
| নাম | প্রয়োজনীয় | প্রোফাইলের নাম বা আইডি বা হ্যান্ডেল, যেমন "John Doe", "@TeamPixel." | স্ট্রিং(সাজেস্ট করা সর্বাধিক ২৫টি অক্ষর) |
| অতিরিক্ত টেক্সট | ঐচ্ছিক |
প্রোফাইল আইডি বা হ্যান্ডেল বা অতিরিক্ত মেটাডেটা হিসেবে ব্যবহার করা যেতে পারে যেমন, "@John-Doe", "৫M ফলোয়ার", "আপনার পছন্দ হতে পারে", "ট্রেন্ডিং", "৫টি নতুন পোস্ট" |
স্ট্রিং(সাজেস্ট করা সর্বাধিক ৪০টি অক্ষর) |
| অবতার | প্রয়োজনীয় |
ব্যবহারকারীর প্রোফাইল ছবি বা অবতার ছবি। বর্গাকার ১:১ ছবি |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| অতিরিক্ত ছবি | ঐচ্ছিক |
প্রোফাইল ব্যাজ, যেমন - যাচাই করা ব্যাজ বর্গাকার ১:১ ছবি |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| ইন্টার্যাকশন সম্পর্কিত মেটাডেটা (ঐচ্ছিক) | |||
| সংখ্যা | প্রয়োজনীয় |
ইন্টার্যাকশনের সংখ্যা দেখান, যেমন - "৩.৭ মিলিয়ন।" মনে রাখবেন: পার্টনারদের হয় Count অথবা CountWithOptionalLabel ব্যবহার করতে হবে। |
স্ট্রিং |
| CountWithOptionalLabel | প্রয়োজনীয় |
ঐচ্ছিক লেবেল সহ ইন্টার্যাকশনের সংখ্যা উল্লেখ করুন, যেমন - "৩.৭ মিলিয়ন লাইক।" মনে রাখবেন: পার্টনারদের Count অথবা CountWithOptionalLabel ব্যবহার করতে হবে। |
স্ট্রিং |
| লেবেল |
ঐচ্ছিক এটি না দেওয়া হলে, ভিজ্যুয়াল দিতেই হবে। |
ইন্ট্যার্যাকশন কীসের জন্য তা উল্লেখ করুন। যেমন - "লাইক।" | স্ট্রিং (সাজেস্ট করা হয়েছে যে সংখ্যা + লেবেল মিলিয়ে সর্বাধিক ২০টি অক্ষর) |
| ভিজ্যুয়াল |
ঐচ্ছিক এটি না দেওয়া হলে, লেবেল দিতেই হবে। |
ইন্ট্যার্যাকশন কীসের জন্য তা উল্লেখ করুন। যেমন - লাইক আইকন, ইমোজি দেখানো ছবি। ১টির বেশি ছবি দিতে পারেন, তবে সব ফর্ম ফ্যাক্টরে সব ছবি নাও দেখানো হতে পারে। বর্গাকার ১:১ ছবি |
নির্দেশনার জন্য ছবির স্পেসিফিকেশন দেখুন। |
| DisplayTimeWindow (ঐচ্ছিক) - সারফেসে কন্টেন্ট দেখানোর জন্য একটি টাইম উইন্ডো সেট করুন | |||
| শুরুর টাইমস্ট্যাম্প | ঐচ্ছিক |
যে ইপক টাইমস্ট্যাম্পের পরে সারফেসে কন্টেন্ট দেখানো হবে। সেট করা না থাকলে, কন্টেন্ট সারফেসে দেখানোর উপযুক্ত হবে। |
মিলিসেকেন্ডে Epoch টাইমস্ট্যাম্প |
| শেষের টাইমস্ট্যাম্প | ঐচ্ছিক |
যে ইপক টাইমস্ট্যাম্পের পরে কন্টেন্ট আর সারফেসে দেখানো হয় না। সেট করা না থাকলে, কন্টেন্ট সারফেসে দেখানোর উপযুক্ত হবে। |
মিলিসেকেন্ডে Epoch টাইমস্ট্যাম্প |
ছবির স্পেসিফিকেশন
Google যাতে অ্যাক্সেস করতে পারে তার জন্য ছবিগুলি সর্বজনীন CDN-এ হোস্ট করতে হবে।
ফাইলের ফর্ম্যাট
PNG, JPG, স্ট্যাটিক GIF, WebP
ফাইলের সর্বাধিক সাইজ
৫১২০ কেবি
অতিরিক্ত সাজেশন
- ছবির নিরাপদ এলাকা: আপনার গুরুত্বপূর্ণ কন্টেন্ট ছবির মাঝখানের ৮০% অংশে রাখুন।
- একটি স্বচ্ছ ব্যাকগ্রাউন্ড ব্যবহার করুন যাতে ছবিটি ডার্ক এবং লাইট থিম সেটিংসে সঠিকভাবে প্রদর্শিত হতে পারে।
ধাপ ২: ক্লাস্টার ডেটা প্রদান করুন
কন্টেন্ট প্রকাশ করার কাজ ব্যাকগ্রাউন্ডে চালানো (যেমন, WorkManager ব্যবহার করে) এবং নিয়মিতভাবে বা কোনও ইভেন্টের ভিত্তিতে শিডিউল করা (যেমন, ব্যবহারকারী প্রতিবার অ্যাপ খুললে বা ব্যবহারকারী কোনও নতুন অ্যাকাউন্ট ফলো করলে) ভালো।
AppEngageSocialClient সোশ্যাল ক্লাস্টার প্রকাশ করার জন্য দায়ী।
ক্লায়েন্টে ক্লাস্টার প্রকাশ করার জন্য নিম্নলিখিত API আছে:
isServiceAvailablepublishRecommendationClusterspublishUserAccountManagementRequestupdatePublishStatusdeleteRecommendationsClustersdeleteUserManagementClusterdeleteClusters
isServiceAvailable
ইন্টিগ্রেশনের জন্য পরিষেবা উপলভ্য কিনা এবং ডিভাইসে কন্টেন্ট দেখানো যাবে কিনা তা চেক করতে এই API ব্যবহার করা হয়।
Engage SDK v1.6.0 এবং তার পরবর্তী ভার্সনের জন্য (সাজেস্ট করা)
Android স্কিল
GitHub-এ দেখুনEngage SDK ইন্টিগ্রেশন
android skills add engage-sdk-integrationUse the engage-sdk-integration skill to use Engage SDK 1.6.0 and refactor isServiceAvailable to pass ServiceAvailabilityRequest for publishing all cluster types.আপনি প্রকাশ করতে চান এমন প্রতিটি ক্লাস্টার প্রকারের জন্য পরিষেবার উপলভ্যতা চেক করতে পারেন। isServiceAvailable API একটি অনুরোধ অবজেক্ট গ্রহণ করে,
ServiceAvailabilityRequest, যার মধ্যে ক্লাস্টার প্রকারগুলি রয়েছে যার জন্য পরিষেবা
উপলভ্যতা চেক করা প্রয়োজন। ServiceAvailabilityRequest-এর জন্য প্রয়োজনীয় ClusterType এনাম ভ্যালু
আপনি নিম্নলিখিত টেবিল থেকে খুঁজে পাবেন।
| ক্লাস্টারের ধরন | ক্লাস্টারের ধরন কনস্ট্যান্ট | পূর্ণসংখ্যার মান |
|---|---|---|
| অজানা | TYPE_UNKNOWN |
0 |
| সাজেশন ক্লাস্টার | TYPE_RECOMMENDATION |
1 |
| ফিচার করা ক্লাস্টার | TYPE_FEATURED |
2 |
| কন্টিনিউয়েশন ক্লাস্টার | TYPE_CONTINUATION |
3 |
| ব্যবহারকারী ম্যানেজমেন্ট ক্লাস্টার | TYPE_ENGAGEMENT |
8 |
| সাবস্ক্রিপশন ক্লাস্টার | TYPE_SUBSCRIPTION |
12 |
Kotlin
val request = ServiceAvailabilityRequest.Builder()
.addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
.addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
.build()
client.isServiceAvailable(request).addOnCompleteListener { task ->
if (task.isSuccessful) {
val availabilityMap = task.result
if (availabilityMap[ClusterType.TYPE_CONTINUATION] == true) {
// Proceed with publishing continuation content
}
if (availabilityMap[ClusterType.TYPE_RECOMMENDATION] == true) {
// Proceed with publishing recommendation content
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
}
জাভা
ServiceAvailabilityRequest request =
new ServiceAvailabilityRequest.Builder()
.addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
.addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
.build();
client.isServiceAvailable(request).addOnCompleteListener(task -> {
if (task.isSuccessful()) {
Map<Integer, Boolean> availabilityMap = task.getResult();
if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_CONTINUATION))) {
// Proceed with publishing continuation content
}
if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_RECOMMENDATION))) {
// Proceed with publishing recommendation content
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
});
শর্তসাপেক্ষ পরিষেবা উপলভ্যতা ফিচার
কিছু ইন্টিগ্রেটেড অ্যাপ বিশেষ কনফিগারেশনের অনুরোধ করে যা খরচ কমানোর জন্য Engage পরিষেবা মাঝে মাঝে চালু ও বন্ধ করে। তবে, এই মাঝে মাঝে কন্টেন্ট ইনজেশন স্ট্র্যাটেজি ব্যবহারকারীর অভিজ্ঞতায় নেতিবাচক প্রভাব ফেলে: পুরনো কন্টেন্ট দেখানো হবে না এবং কিছু সারফেস পরিবেশন করা হবে না।
v1.6.0 থেকে শুরু করে, Engage SDK নির্দিষ্ট ক্লাস্টার ধরনের জন্য উপলভ্যতা চেক করার অনুমতি দেয়। আপনি যেকোনও ক্লাস্টার টাইপের জন্য এই ফিচার চালু করতে আগ্রহী হলে, engage-developers@google.com-এ যোগাযোগ করুন।
v1.6.0-এর আগের SDK ভার্সনের জন্য (বন্ধ হয়ে গেছে)
Kotlin
client.isServiceAvailable.addOnCompleteListener { task ->
if (task.isSuccessful) {
// Handle IPC call success
if(task.result) {
// Service is available on the device, proceed with content publish
// calls.
} else {
// Service is not available, no further action is needed.
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
}
জাভা
client.isServiceAvailable().addOnCompleteListener(task - > {
if (task.isSuccessful()) {
// Handle success
if(task.getResult()) {
// Service is available on the device, proceed with content publish
// calls.
} else {
// Service is not available, no further action is needed.
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
});
publishRecommendationClusters
এই API-এর মাধ্যমে RecommendationCluster অবজেক্টের তালিকা প্রকাশ করা হয়।
RecommendationCluster অবজেক্টে নিম্নলিখিত অ্যাট্রিবিউট থাকতে পারে:
| অ্যাট্রিবিউট | প্রয়োজনীয়তা | বর্ণনা |
|---|---|---|
| SocialPostEntity বা PortraitMediaEntity-এর তালিকা | প্রয়োজনীয় | এই সাজেশন ক্লাস্টারের জন্য সাজেশন তৈরি করে এমন এন্টিটির তালিকা। একটি ক্লাস্টারে থাকা এন্টিটি একই ধরনের হতে হবে। |
| শীর্ষক | প্রয়োজনীয় | সাজেশন ক্লাস্টারের শীর্ষক (যেমন, আপনার বন্ধুদের থেকে লেটেস্ট)। সাজেস্ট করা টেক্সটের সাইজ: ২৫টি অক্ষরের কম (টেক্সট অনেক বড় হলে উপবৃত্ত দেখানো হতে পারে) |
| সাবটাইটেল | ঐচ্ছিক | সাজেশন ক্লাস্টারের সাবটাইটেল। |
| অ্যাকশন Uri | ঐচ্ছিক |
পার্টনার অ্যাপের পৃষ্ঠার ডিপ লিঙ্ক যেখানে ব্যবহারকারী সাজেশনের সম্পূর্ণ তালিকা দেখতে পাবেন। মনে রাখবেন: অ্যাট্রিবিউশনের জন্য আপনি ডিপ লিঙ্ক ব্যবহার করতে পারবেন। এই প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন |
Kotlin
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Latest from your friends")
.build())
.build())
জাভা
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
new RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Latest from your friends")
.build())
.build());
পরিষেবাটি অনুরোধ পেলে, একটি ট্রানজ্যাকশনের মধ্যে নিম্নলিখিত অ্যাকশনগুলি নেওয়া হয়:
- আগে থেকে থাকা সব সাজেশন ক্লাস্টার ডেটা সরিয়ে দেওয়া হয়েছে।
- অনুরোধ থেকে পাওয়া ডেটা পার্স করা হয় এবং নতুন সাজেশন ক্লাস্টারে স্টোর করা হয়।
কোনও সমস্যা হলে, সম্পূর্ণ অনুরোধ বাতিল করা হয় এবং বর্তমান স্ট্যাটাস বজায় রাখা হয়।
publishUserAccountManagementRequest
এই API ব্যবহার করে সাইন-ইন কার্ড প্রকাশ করা হয়। সাইন-ইন অ্যাকশন ব্যবহারকারীকে অ্যাপের সাইন-ইন পৃষ্ঠায় নিয়ে যায় যাতে অ্যাপটি কন্টেন্ট প্রকাশ করতে পারে (অথবা আরও পছন্দমতো কন্টেন্ট প্রদান করতে পারে)
নিম্নলিখিত মেটাডেটা সাইন-ইন কার্ডের অংশ -
| অ্যাট্রিবিউট | প্রয়োজনীয়তা | বর্ণনা |
|---|---|---|
| অ্যাকশন Uri | প্রয়োজনীয় | অ্যাকশনের ডিপলিঙ্ক (যেমন, অ্যাপের সাইন-ইন পৃষ্ঠায় নেভিগেট করে) |
| ছবি | ঐচ্ছিক - এটি না দিলে, শীর্ষক দিতেই হবে |
কার্ডে দেখানো ছবি ১২৬৪x৭১২ রেজোলিউশন সহ ১৬x৯ অ্যাস্পেক্ট রেশিওর ছবি |
| শীর্ষক | ঐচ্ছিক - এটি না দিলে, ছবি দিতেই হবে | কার্ডে লেখা নাম |
| অ্যাকশন টেক্সট | ঐচ্ছিক | CTA-তে দেখানো টেক্সট (যেমন, সাইন-ইন করুন) |
| সাবটাইটেল | ঐচ্ছিক | কার্ডে ঐচ্ছিক সাবটাইটেল |
Kotlin
var SIGN_IN_CARD_ENTITY =
SignInCardEntity.Builder()
.addPosterImage(
Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build()
client.publishUserAccountManagementRequest(
PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
জাভা
SignInCardEntity SIGN_IN_CARD_ENTITY =
new SignInCardEntity.Builder()
.addPosterImage(
new Image.Builder()
.setImageUri(Uri.parse("http://www.x.com/image.png"))
.setImageHeightInPixel(500)
.setImageWidthInPixel(500)
.build())
.setActionText("Sign In")
.setActionUri(Uri.parse("http://xx.com/signin"))
.build();
client.publishUserAccountManagementRequest(
new PublishUserAccountManagementRequest.Builder()
.setSignInCardEntity(SIGN_IN_CARD_ENTITY)
.build());
পরিষেবাটি অনুরোধ পেলে, একটি ট্রানজ্যাকশনের মধ্যে নিম্নলিখিত অ্যাকশনগুলি নেওয়া হয়:
- ডেভেলপার পার্টনারের থেকে পাওয়া আগে থেকে থাকা
UserAccountManagementClusterডেটা সরিয়ে দেওয়া হয়েছে। - অনুরোধ থেকে পাওয়া ডেটা পার্স করা হয় এবং আপডেট করা UserAccountManagementCluster ক্লাস্টারে স্টোর করা হয়।
কোনও সমস্যা হলে, সম্পূর্ণ অনুরোধ বাতিল করা হয় এবং বর্তমান স্ট্যাটাস বজায় রাখা হয়।
updatePublishStatus
কোনও অভ্যন্তরীণ ব্যবসায়িক কারণে, কোনও ক্লাস্টার প্রকাশ করা না হলে, আমরা updatePublishStatus API ব্যবহার করে প্রকাশের স্ট্যাটাস আপডেট করার জন্য জোরালোভাবে সাজেস্ট করি। এটি গুরুত্বপূর্ণ কারণ :
- কন্টেন্ট প্রকাশিত হলেও (STATUS == PUBLISHED), সব পরিস্থিতিতে স্ট্যাটাস প্রদান করা গুরুত্বপূর্ণ, যাতে ড্যাশবোর্ডগুলি আপনার ইন্টিগ্রেশনের স্বাস্থ্য এবং অন্যান্য মেট্রিক্স জানাতে এই স্পষ্ট স্ট্যাটাস ব্যবহার করতে পারে।
- কোনও কন্টেন্ট প্রকাশ করা না হলেও ইন্টিগ্রেশন স্ট্যাটাস যদি ঠিক থাকে (STATUS == NOT_PUBLISHED), Google অ্যাপের হেলথ ড্যাশবোর্ডে অ্যালার্ট ট্রিগার করা এড়াতে পারে। এটি নিশ্চিত করে যে প্রদানকারীর দৃষ্টিকোণ থেকে একটি প্রত্যাশিত পরিস্থিতির কারণে কন্টেন্ট প্রকাশ করা হয়নি।
- এটি ডেভেলপারদের ডেটা কখন প্রকাশিত হয় বনাম কখন হয় না সে সম্পর্কে ইনসাইট প্রদান করতে সাহায্য করে।
- Google স্ট্যাটাস কোড ব্যবহার করে ব্যবহারকারীকে অ্যাপে নির্দিষ্ট কিছু অ্যাকশন করার জন্য অনুরোধ করতে পারে যাতে তারা অ্যাপের কন্টেন্ট দেখতে বা সমস্যাটি সমাধান করতে পারে।
প্রকাশের স্ট্যাটাস কোডের তালিকা হল :
// Content is published
AppEngagePublishStatusCode.PUBLISHED,
// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,
// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,
// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,
// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,
// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,
// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,
// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,
// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER
ব্যবহারকারী লগ-ইন না করার কারণে কন্টেন্ট প্রকাশ করা না হলে, Google সাইন-ইন কার্ড প্রকাশ করার সাজেশন দেবে। কোনও কারণে পরিষেবা প্রদানকারী সাইন-ইন কার্ড প্রকাশ করতে না পারলে, আমরা স্ট্যাটাস কোড NOT_PUBLISHED_REQUIRES_SIGN_IN সহ updatePublishStatus API কল করার সাজেশন দিই
Kotlin
client.updatePublishStatus(
PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build())
জাভা
client.updatePublishStatus(
new PublishStatusRequest.Builder()
.setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
.build());
deleteRecommendationsClusters
এই API-এর মাধ্যমে সাজেশন ক্লাস্টারের কন্টেন্ট মুছে ফেলা হয়।
Kotlin
client.deleteRecommendationsClusters()
জাভা
client.deleteRecommendationsClusters();
পরিষেবাটি অনুরোধ পেলে, এটি সাজেশন ক্লাস্টার থেকে আগে থেকে থাকা ডেটা সরিয়ে দেয়। কোনও সমস্যা হলে, সম্পূর্ণ অনুরোধ বাতিল করা হয় এবং আগের অবস্থা বজায় রাখা হয়।
deleteUserManagementCluster
UserAccountManagement ক্লাস্টারের কন্টেন্ট মুছে ফেলার জন্য এই API ব্যবহার করা হয়।
Kotlin
client.deleteUserManagementCluster()
জাভা
client.deleteUserManagementCluster();
পরিষেবাটি অনুরোধ পেলে, এটি UserAccountManagement ক্লাস্টার থেকে আগে থেকে থাকা ডেটা সরিয়ে দেয়। কোনও সমস্যা হলে, সম্পূর্ণ অনুরোধ বাতিল করা হয় এবং আগের অবস্থা বজায় রাখা হয়।
deleteClusters
প্রদত্ত ক্লাস্টার টাইপের কন্টেন্ট মুছে ফেলার জন্য এই API ব্যবহার করা হয়।
Kotlin
client.deleteClusters(
DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build())
জাভা
client.deleteClusters(
new DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
...
.build());
পরিষেবাটি অনুরোধ পেলে, এটি নির্দিষ্ট ক্লাস্টার প্রকারের সাথে মিলে যাওয়া সমস্ত ক্লাস্টার থেকে বিদ্যমান ডেটা সরিয়ে দেয়। ক্লায়েন্ট এক বা একাধিক ক্লাস্টার টাইপ পাস করার বিকল্প বেছে নিতে পারেন। কোনও সমস্যা হলে, সম্পূর্ণ অনুরোধ বাতিল করা হয় এবং বর্তমান স্ট্যাটাস বজায় রাখা হয়।
সমস্যা ম্যানেজ করা
প্রকাশিত API থেকে টাস্কের ফলাফল শোনার জন্য অত্যন্ত সাজেস্ট করা হয় যাতে একটি সফল টাস্ক রিকভার ও আবার জমা দেওয়ার জন্য ফলো-আপ অ্যাকশন নেওয়া যেতে পারে।
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(...)
.build())
.addOnCompleteListener(
task -> {
if (task.isSuccessful()) {
// do something
} else {
Exception exception = task.getException();
if (exception instanceof AppEngageException) {
@AppEngageErrorCode
int errorCode = ((AppEngageException) exception).getErrorCode();
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
});
সমস্যাটি AppEngageException হিসেবে দেখানো হয় এবং এর কারণ হিসেবে
সমস্যার কোড উল্লেখ করা থাকে।
| সমস্যার কোড | সমস্যার নাম | মনে রাখবেন |
|---|---|---|
1 |
SERVICE_NOT_FOUND |
প্রদত্ত ডিভাইসে পরিষেবাটি উপলভ্য নয়। |
2 |
SERVICE_NOT_AVAILABLE |
পরিষেবাটি প্রদত্ত ডিভাইসে উপলভ্য, তবে কল করার সময় এটি উপলভ্য নয় (যেমন, এটি স্পষ্টভাবে বন্ধ করা আছে)। |
3 |
SERVICE_CALL_EXECUTION_FAILURE |
থ্রেডিং সংক্রান্ত সমস্যার কারণে টাস্ক এক্সিকিউট করা যায়নি। এই ক্ষেত্রে, এটি আবার চেষ্টা করা যেতে পারে। |
4 |
SERVICE_CALL_PERMISSION_DENIED |
কলারকে পরিষেবা কল করার অনুমতি দেওয়া হয়নি। |
5 |
SERVICE_CALL_INVALID_ARGUMENT |
অনুরোধে ভুল ডেটা আছে (যেমন, অনুমোদিত ক্লাস্টারের সংখ্যার চেয়ে বেশি)। |
6 |
SERVICE_CALL_INTERNAL |
পরিষেবার দিকে কোনও সমস্যা হয়েছে। |
7 |
SERVICE_CALL_RESOURCE_EXHAUSTED |
পরিষেবা কল খুব ঘন ঘন করা হয়। |
ধাপ ৩: ব্রডকাস্ট ইনটেন্ট ম্যানেজ করা
জবের মাধ্যমে কন্টেন্ট প্রকাশ করার API কল করার পাশাপাশি, কন্টেন্ট প্রকাশের অনুরোধ পাওয়ার জন্য
BroadcastReceiver সেট-আপ
করতে হবে।
ব্রডকাস্ট ইনটেন্টের লক্ষ্য হল মূলত অ্যাপ আবার অ্যাক্টিভেট করা এবং ডেটা সিঙ্ক করতে বাধ্য করা। ব্রডকাস্ট ইনটেন্ট খুব ঘন ঘন পাঠানোর জন্য ডিজাইন করা হয়নি। এটি শুধুমাত্র তখনই ট্রিগার করা হয় যখন Engage পরিষেবা নির্ধারণ করে যে কন্টেন্টটি বাসি হতে পারে (যেমন, এক সপ্তাহ পুরনো)। এর ফলে, ব্যবহারকারী অনেকদিন ধরে অ্যাপ্লিকেশন ব্যবহার না করলেও, তিনি যে নতুন কন্টেন্ট দেখতে পাবেন, সেই ব্যাপারে আরও বেশি নিশ্চিত হওয়া যায়।
BroadcastReceiver অবশ্যই নিম্নলিখিত দুটি উপায়ে সেট-আপ করতে হবে:
Context.registerReceiver()ব্যবহার করেBroadcastReceiverক্লাসের ইনস্ট্যান্স ডায়নামিক্যালি রেজিস্টার করুন। এটি মেমরিতে এখনও লাইভ আছে এমন অ্যাপ্লিকেশন থেকে কমিউনিকেশন চালু করে।
Kotlin
class AppEngageBroadcastReceiver : BroadcastReceiver(){
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION
// broadcast is received
}
fun registerBroadcastReceivers(context: Context){
var context = context
context = context.applicationContext
// Register Recommendation Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
}
জাভা
class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received
}
public static void registerBroadcastReceivers(Context context) {
context = context.getApplicationContext();
// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
}
আপনার
AndroidManifest.xmlফাইলে<receiver>ট্যাগ সহ স্ট্যাটিক্যালি একটি ইমপ্লিমেন্টেশন ঘোষণা করুন। এটি অ্যাপ্লিকেশনটিকে ব্রডকাস্ট ইনটেন্ট গ্রহণ করার অনুমতি দেয় যখন এটি চলছে না এবং অ্যাপ্লিকেশনটিকে কন্টেন্ট প্রকাশ করারও অনুমতি দেয়।
<application>
<receiver
android:name=".AppEngageBroadcastReceiver"
android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
android:exported="true"
android:enabled="true">
<intent-filter>
<action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
</intent-filter>
</receiver>
</application>
পরিষেবাটি নিম্নলিখিত ইনটেন্ট পাঠাবে:
com.google.android.engage.action.PUBLISH_RECOMMENDATIONএই ইনটেন্ট পাওয়ার সময়publishRecommendationClustersকল শুরু করার সাজেশন দেওয়া হয়।
ইন্টিগ্রেশন ওয়ার্কফ্লো
ইন্টিগ্রেশন সম্পূর্ণ হওয়ার পরে সেটি যাচাই করার জন্য ধাপে-ধাপে গাইড পেতে, Engage ডেভেলপার ইন্টিগ্রেশন ওয়ার্কফ্লো দেখুন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
প্রায়শই জিজ্ঞাসিত প্রশ্নের জন্য Engage SDK-এর প্রায়শই জিজ্ঞাসিত প্রশ্ন দেখুন।
যোগাযোগ করুন
ইন্টিগ্রেশন প্রসেস চলাকালীন কোনও প্রশ্ন থাকলে
engage-developers@google.com-এর সাথে যোগাযোগ করুন। আমাদের টিম যত তাড়াতাড়ি সম্ভব
উত্তর দেবে।
পরবর্তী ধাপ
এই ইন্টিগ্রেশন সম্পূর্ণ করার পরে, আপনার পরবর্তী ধাপগুলি নিম্নরূপ:
engage-developers@google.com-এ ইমেল পাঠান এবং Google-এর মাধ্যমে পরীক্ষা করার জন্য প্রস্তুত আপনার ইন্টিগ্রেটেড APK অ্যাটাচ করুন।- ইন্টিগ্রেশন যাতে প্রত্যাশা অনুযায়ী কাজ করে তা নিশ্চিত করতে Google ইন্টার্নালি যাচাই ও পর্যালোচনা করে। কোনও পরিবর্তন করতে হলে, Google প্রয়োজনীয় বিবরণ সহ আপনার সাথে যোগাযোগ করবে।
- পরীক্ষা সম্পূর্ণ হলে এবং কোনও পরিবর্তন করার প্রয়োজন না থাকলে, Google আপনার সাথে যোগাযোগ করে জানাবে যে আপনি Play Store-এ আপডেট করা ও ইন্টিগ্রেট করা APK প্রকাশ করা শুরু করতে পারেন।
- আপনার আপডেট করা APK, Play Store-এ প্রকাশিত হয়েছে বলে Google কনফার্ম করার পরে, আপনার সাজেশন, ক্লাস্টার প্রকাশিত হবে এবং ব্যবহারকারীরা দেখতে পাবেন।