লাইসেন্সিং রেফারেন্স

LVL ক্লাস ও ইন্টারফেস

Android SDK-এর মাধ্যমে উপলভ্য লাইসেন্স যাচাইকরণ লাইব্রেরির (LVL) সব সোর্স ফাইল সারণী ১-এ তালিকাভুক্ত করা আছে। সব ফাইল com.android.vending.licensing প্যাকেজের অংশ।

টেবিল ১. LVL লাইব্রেরি ক্লাস ও ইন্টারফেসের সারসংক্ষেপ।

বিভাগ নাম বর্ণনা
লাইসেন্স চেক ও ফলাফল LicenseChecker লাইসেন্স চেক শুরু করার জন্য আপনি যে ক্লাস (বা সাবক্লাস) ইনস্ট্যান্টিয়েট করেন।
LicenseCheckerCallback লাইসেন্স চেক করার ফলাফল ম্যানেজ করার জন্য আপনি যে ইন্টারফেস প্রয়োগ করেন।
নীতি নীতি লাইসেন্স সংক্রান্ত উত্তরের উপর ভিত্তি করে, অ্যাপ্লিকেশনে অ্যাক্সেস দেওয়া হবে কিনা তা নির্ধারণ করার জন্য আপনি যে ইন্টারফেস প্রয়োগ করেন।
ServerManagedPolicy ডিফল্ট Policy প্রয়োগ। লাইসেন্সিং সার্ভার দ্বারা প্রদত্ত সেটিংস ব্যবহার করে লাইসেন্স ডেটার স্থানীয় স্টোরেজ, লাইসেন্সের বৈধতা, আবার চেষ্টা করুন।
StrictPolicy বিকল্প Policy প্রয়োগ। শুধুমাত্র সার্ভার থেকে সরাসরি লাইসেন্স সংক্রান্ত উত্তরের ভিত্তিতে লাইসেন্সিং প্রয়োগ করে। কোনও ক্যাশিং বা অনুরোধ আবার চেষ্টা করার সুবিধা নেই।
ডেটা অস্পষ্ট করা
(ঐচ্ছিক)
Obfuscator আপনি যদি Policy (যেমন ServerManagedPolicy) ব্যবহার করেন যা একটি স্থায়ী স্টোরে লাইসেন্স রেসপন্স ডেটা ক্যাশে করে, তাহলে আপনি যে ইন্টারফেসটি প্রয়োগ করেন। লেখা বা পড়া হচ্ছে এমন ডেটা এনকোড ও ডিকোড করার জন্য অবফাসকেশন অ্যালগরিদম প্রয়োগ করে।
AESObfuscator ডিফল্ট অবফাসকেটর ইমপ্লিমেন্টেশন যা ডেটা অবফাসকেট/আনঅবফাসকেট করতে AES এনক্রিপশন/ডিক্রিপশন অ্যালগরিদম ব্যবহার করে।
ডিভাইসের সীমাবদ্ধতা
(ঐচ্ছিক)
DeviceLimiter আপনি কোনও অ্যাপ্লিকেশনের ব্যবহার নির্দিষ্ট ডিভাইসে সীমাবদ্ধ করতে চাইলে, যে ইন্টারফেস প্রয়োগ করেন। LicenseValidator থেকে কল করা হয়েছে। DeviceLimiter প্রয়োগ করা বেশিরভাগ অ্যাপ্লিকেশনের জন্য সাজেস্ট করা হয় না কারণ এর জন্য ব্যাকএন্ড সার্ভার প্রয়োজন হয় এবং এর ফলে ব্যবহারকারী লাইসেন্সপ্রাপ্ত অ্যাপ্লিকেশনের অ্যাক্সেস হারাতে পারেন, যদি না এটি যত্ন সহকারে ডিজাইন করা হয়।
NullDeviceLimiter ডিফল্ট DeviceLimiter ইমপ্লিমেন্টেশন যা কোনও অপারেশন নয় (সব ডিভাইসে অ্যাক্সেস দেয়)।
লাইব্রেরি কোর, কোনও ইন্টিগ্রেশন প্রয়োজন নেই ResponseData লাইসেন্স সংক্রান্ত উত্তরের ফিল্ড ধারণকারী ক্লাস।
LicenseValidator লাইসেন্সিং সার্ভার থেকে পাওয়া উত্তর ডিক্রিপ্ট ও যাচাই করে এমন ক্লাস।
ValidationException Obfuscator-এর মাধ্যমে ম্যানেজ করা ডেটার ইন্টিগ্রিটি যাচাই করার সময় হওয়া সমস্যা নির্দেশ করে এমন ক্লাস।
PreferenceObfuscator ইউটিলিটি ক্লাস যা সিস্টেমের SharedPreferences স্টোরে অস্পষ্ট ডেটা লেখে/পড়ে।
ILicensingService একমুখী IPC ইন্টারফেস যার মাধ্যমে Google Play ক্লায়েন্টকে লাইসেন্স চেক করার অনুরোধ পাঠানো হয়।
ILicenseResultListener একমুখী IPC কলব্যাক প্রয়োগ, যার মাধ্যমে অ্যাপ্লিকেশন লাইসেন্সিং সার্ভার থেকে অ্যাসিঙ্ক্রোনাস উত্তর পায়।

সার্ভার রেসপন্স

লাইসেন্সিং সার্ভার থেকে ফেরত আসা সব লাইসেন্স রেসপন্স ফিল্ডের তালিকা সারণী ২-এ দেওয়া আছে।

টেবিল ২. Google Play সার্ভার থেকে পাওয়া লাইসেন্স রেসপন্স ফিল্ডের সংক্ষিপ্ত বিবরণ।

ফিল্ড বর্ণনা
responseCode লাইসেন্সিং সার্ভার থেকে পাওয়া রেসপন্স কোড। রেসপন্স কোডগুলি সার্ভার রেসপন্স কোড-এ উল্লেখ করা আছে।
signedData লাইসেন্সিং সার্ভার থেকে পাওয়া ডেটা সহ স্ট্রিং কনক্যাটেনেশন, যেমন: responseCode|nonce|packageName|versionCode|userId|timestamp:extras.
  • responseCode: লাইসেন্সিং সার্ভার থেকে পাওয়া রেসপন্স কোড।
  • nonce: অনুরোধের ননস আইডেন্টিফায়ার।
  • packageName: লাইসেন্স চেক করার জন্য অ্যাপের প্যাকেজের নাম।
  • versionCode: লাইসেন্স চেক করার জন্য অ্যাপের ভার্সন কোড।
  • userId: প্রতিটি অ্যাপের জন্য ব্যবহারকারীর একটি অনন্য আইডি, যেখানে একই ব্যবহারকারী বিভিন্ন অ্যাপের জন্য আলাদা আইডি পান।
  • timestamp: অনুরোধের সময় থেকে ১ জানুয়ারি ১৯৭০ ০০:০০:০০ UTC পর্যন্ত মিলিসেকেন্ডের সংখ্যা।
  • extras: অ্যাপের লাইসেন্স ম্যানেজমেন্টে সাহায্য করার জন্য অতিরিক্ত তথ্য। অতিরিক্ত ফিল্ডগুলি সার্ভার রেসপন্স এক্সট্রা-তে আউটলাইন করা আছে।
signature অ্যাপ-নির্দিষ্ট কী ব্যবহার করে signedData-এর স্বাক্ষর।

সার্ভার থেকে প্রতিক্রিয়ার কোড

লাইসেন্সিং সার্ভার দ্বারা সমর্থিত সমস্ত লাইসেন্স প্রতিক্রিয়া কোড সারণী ৩-এ তালিকাভুক্ত করা হয়েছে। সাধারণত, কোনও অ্যাপ্লিকেশনকে এই সব রেসপন্স কোড ম্যানেজ করতে হয়। ডিফল্ট হিসেবে, LVL-এ LicenseValidator ক্লাস আপনার জন্য এইসব রেসপন্স কোডের প্রয়োজনীয় হ্যান্ডলিং প্রদান করে।

সারণী ৩. লাইসেন্স রেসপন্সে Google Play সার্ভার থেকে ফেরত পাঠানো রেসপন্স কোডের সারসংক্ষেপ।

রেসপন্স কোড পূর্ণসংখ্যা-মান উপস্থাপনা বর্ণনা স্বাক্ষর করা হয়েছে? অতিরিক্ত কমেন্ট
LICENSED 0 অ্যাপ্লিকেশনটি ব্যবহারকারীর জন্য লাইসেন্সপ্রাপ্ত। ব্যবহারকারী অ্যাপ্লিকেশনটি কিনেছেন, অথবা অ্যাপ্লিকেশনের আলফা বা বিটা ভার্সন ডাউনলোড এবং ইনস্টল করার জন্য অনুমোদিত। হ্যাঁ VT, GT, GR Policy সীমাবদ্ধতা অনুযায়ী অ্যাক্সেসের অনুমতি দিন।
LICENSED_OLD_KEY 2 অ্যাপ্লিকেশনটি ব্যবহারকারীকে লাইসেন্স দেওয়া হয়েছে, তবে একটি আপডেট করা অ্যাপ্লিকেশন সংস্করণ উপলভ্য রয়েছে যা একটি ভিন্ন কী দিয়ে স্বাক্ষরিত। হ্যাঁ VT, GT, GR, UT বিকল্প হিসেবে, Policy-এর সীমাবদ্ধতা অনুযায়ী অ্যাক্সেসের অনুমতি দিন।

ইনস্টল করা অ্যাপ্লিকেশন ভার্সন দ্বারা ব্যবহৃত কী পেয়ারটি ভুল বা আপোস করা হয়েছে তা নির্দেশ করতে পারে। প্রয়োজন হলে অ্যাপ্লিকেশন অ্যাক্সেস দিতে পারে অথবা ব্যবহারকারীকে জানাতে পারে যে আপগ্রেড উপলভ্য আছে এবং আপগ্রেড না করা পর্যন্ত ব্যবহার সীমিত করতে পারে।

NOT_LICENSED 1 ব্যবহারকারীর কাছে এই অ্যাপ্লিকেশন ব্যবহার করার লাইসেন্স নেই। না অ্যাক্সেসের অনুমতি দেবেন না।
ERROR_CONTACTING_SERVER 257 স্থানীয় সমস্যা — Google Play অ্যাপ্লিকেশন লাইসেন্সিং সার্ভারের সাথে কানেক্ট করতে পারেনি, সম্ভবত নেটওয়ার্ক উপলভ্য না থাকার কারণে। না Policy বার আবার চেষ্টা করার সীমা অনুযায়ী লাইসেন্স চেক করার জন্য আবার চেষ্টা করুন।
ERROR_SERVER_FAILURE 4 সার্ভার সংক্রান্ত সমস্যা — লাইসেন্সিংয়ের জন্য সার্ভার অ্যাপ্লিকেশনটির কী পেয়ার লোড করতে পারেনি। না Policy বার আবার চেষ্টা করার সীমা অনুযায়ী লাইসেন্স চেক করার জন্য আবার চেষ্টা করুন।
ERROR_INVALID_PACKAGE_NAME 258 লোকাল সমস্যা — অ্যাপ্লিকেশনটি এমন একটি প্যাকেজের জন্য লাইসেন্স চেক করার অনুরোধ করেছে যা ডিভাইসে ইনস্টল করা নেই। না লাইসেন্স চেক করার জন্য আবার চেষ্টা করবেন না।

সাধারণত ডেভেলপমেন্ট সংক্রান্ত সমস্যার কারণে এটি হয়।

ERROR_NON_MATCHING_UID 259 লোকাল সমস্যা — অ্যাপ্লিকেশনটি এমন একটি প্যাকেজের জন্য লাইসেন্স চেক করার অনুরোধ করেছে যার UID (প্যাকেজ, ব্যবহারকারীর আইডি পেয়ার) অনুরোধকারী অ্যাপ্লিকেশনের সাথে ম্যাচ করে না। না লাইসেন্স চেক করার জন্য আবার চেষ্টা করবেন না।

সাধারণত ডেভেলপমেন্ট সংক্রান্ত সমস্যার কারণে এটি হয়।

ERROR_NOT_MARKET_MANAGED 3 সার্ভার সংক্রান্ত সমস্যা — Google Play অ্যাপ্লিকেশনটি (প্যাকেজের নাম) শনাক্ত করতে পারেনি। না লাইসেন্স চেক করার জন্য আবার চেষ্টা করবেন না।

এটি ইঙ্গিত করতে পারে যে অ্যাপ্লিকেশনটি Google Play-এর মাধ্যমে প্রকাশ করা হয়নি বা লাইসেন্সিং প্রয়োগে ডেভেলপমেন্ট সংক্রান্ত ত্রুটি রয়েছে।

মনে রাখবেন: টেস্টিং এনভায়রনমেন্ট সেট-আপ করা-তে যেমন উল্লেখ করা আছে, Google Play Console-এর মাধ্যমে অ্যাপ্লিকেশন ডেভেলপার এবং যেকোনও রেজিস্টার করা টেস্ট ব্যবহারকারীর জন্য রেসপন্স কোড ম্যানুয়ালি ওভাররাইড করা যেতে পারে।

মনে রাখবেন: আগে আপনি কোনও অ্যাপের অপ্রকাশিত "ড্রাফ্ট" ভার্সন আপলোড করে সেটি পরীক্ষা করতে পারতেন। এই কার্যকারিতা আর সমর্থিত নয়; পরিবর্তে, আপনাকে অবশ্যই এটি আলফা বা বিটা ডিস্ট্রিবিউশন চ্যানেলে প্রকাশ করতে হবে। আরও তথ্যের জন্য, ড্রাফ্ট অ্যাপ আর কাজ করে না দেখুন।

সার্ভার রেসপন্স এক্সট্রা

অ্যাপ্লিকেশন রিফান্ড পিরিয়ড জুড়ে অ্যাপ্লিকেশনে অ্যাক্সেস ম্যানেজ করার জন্য আপনার অ্যাপ্লিকেশনকে সাহায্য করতে এবং অন্যান্য তথ্য প্রদান করতে, লাইসেন্সিং সার্ভার লাইসেন্স সংক্রান্ত উত্তরে বেশ কিছু তথ্য অন্তর্ভুক্ত করে। বিশেষ করে, এই পরিষেবা অ্যাপ্লিকেশনের লাইসেন্সের বৈধতার সময়কাল, আবার চেষ্টা করার গ্রেস পিরিয়ড, সর্বাধিক অনুমোদিত আবার চেষ্টা করার সংখ্যা এবং অন্যান্য সেটিংসের জন্য প্রস্তাবিত মান প্রদান করে। আপনার অ্যাপ্লিকেশন APK এক্সপ্যানশন ফাইল ব্যবহার করলে, উত্তরে ফাইলের নাম, সাইজ ও URL-ও অন্তর্ভুক্ত থাকে। সার্ভার, লাইসেন্স উত্তরের "অতিরিক্ত" ফিল্ডে কী-ভ্যালু পেয়ার হিসেবে সেটিংস যোগ করে।

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

টেবিল ৪. লাইসেন্স সংক্রান্ত উত্তরে Google Play সার্ভার থেকে পাওয়া লাইসেন্স-ম্যানেজমেন্ট সেটিংসের সারাংশ।

অতিরিক্তবর্ণনা
VT লাইসেন্সের বৈধতার টাইমস্ট্যাম্প। বর্তমান (ক্যাশে করা) লাইসেন্স রেসপন্সের মেয়াদ শেষ হওয়ার তারিখ/সময় নির্দিষ্ট করে এবং লাইসেন্সিং সার্ভারে এটি আবার চেক করতে হবে। লাইসেন্সের ভ্যালিডিটির মেয়াদ সম্পর্কে নিচের বিভাগটি দেখুন।
GT অতিরিক্ত সময়কালের টাইমস্ট্যাম্প। সেই সময়সীমার শেষ তারিখ উল্লেখ করে, যে সময়সীমার মধ্যে কোনও নীতি অ্যাপ্লিকেশন অ্যাক্সেস করার অনুমতি দিতে পারে, যদিও রেসপন্স স্ট্যাটাস হল RETRY।

সার্ভার এই ভ্যালু ম্যানেজ করে, তবে সাধারণত ৫ বা তার বেশি দিন হতে পারে। আবার চেষ্টা করার সময়সীমা এবং সর্বাধিক কতবার চেষ্টা করা যাবে সম্পর্কে জানতে নিচের বিভাগটি দেখুন।

GR সর্বাধিক কতবার চেষ্টা করা যাবে। ব্যবহারকারীকে অ্যাপ্লিকেশনে অ্যাক্সেস না দেওয়ার আগে, Policy-এর কতগুলি পরপর RETRY লাইসেন্স চেক অনুমতি দেওয়া উচিত তা নির্দিষ্ট করে।

সার্ভার এই ভ্যালু ম্যানেজ করে, তবে সাধারণত এই ভ্যালু "১০" বা তার বেশি হয়। আবার চেষ্টা করার সময়সীমা এবং সর্বাধিক কতবার চেষ্টা করা যাবে সম্পর্কে জানতে নিচের বিভাগটি দেখুন।

UT টাইমস্ট্যাম্প আপডেট করুন। এই অ্যাপ্লিকেশনের সবচেয়ে সাম্প্রতিক আপডেট আপলোড ও প্রকাশ করার দিন/সময় উল্লেখ করে।

সার্ভার এই অতিরিক্ত শুধুমাত্র LICENSED_OLD_KEYS উত্তরের জন্য ফেরত দেয়, যাতে Policy নির্ধারণ করতে পারে যে অ্যাপ্লিকেশনে ব্যবহারকারীর অ্যাক্সেস অস্বীকার করার আগে নতুন লাইসেন্সিং কী সহ আপডেট প্রকাশ করার পর থেকে কত সময় অতিবাহিত হয়েছে।

FILE_URL1 বা FILE_URL2 এক্সপ্যানশন ফাইলের URL (১ হল মূল ফাইলের জন্য, ২ হল প্যাচ ফাইল)। HTTP-এর মাধ্যমে ফাইল ডাউনলোড করতে এটি ব্যবহার করুন।
FILE_NAME1 বা FILE_NAME2 এক্সপ্যানশন ফাইলের নাম (১ হল মূল ফাইল, ২ হল প্যাচ ফাইল)। ডিভাইসে ফাইল সেভ করার সময় আপনাকে এই নাম ব্যবহার করতে হবে।
FILE_SIZE1 বা FILE_SIZE2 বাইটে ফাইলের সাইজ (১ হল মূল ফাইলের জন্য, ২ হল প্যাচ ফাইল)। ডাউনলোড করার সময় সহায়তা করতে এবং ডাউনলোডের আগে ডিভাইসের শেয়ার করা স্টোরেজ লোকেশনে পর্যাপ্ত জায়গা আছে কিনা তা নিশ্চিত করতে এটি ব্যবহার করুন।

লাইসেন্সের বৈধতার মেয়াদ

Google Play লাইসেন্সিং সার্ভার ডাউনলোড করা সব অ্যাপ্লিকেশনের জন্য লাইসেন্সের বৈধতার মেয়াদ সেট করে। এই সময়সীমা থেকে বোঝা যায় যে কতক্ষণ ধরে কোনও অ্যাপ্লিকেশনের লাইসেন্স স্ট্যাটাস অপরিবর্তিত থাকবে এবং অ্যাপ্লিকেশনের লাইসেন্সিং Policy দ্বারা ক্যাশে করা যাবে। লাইসেন্সিং সার্ভার সব লাইসেন্স চেক করার উত্তরে ভ্যালিডিটির মেয়াদ অন্তর্ভুক্ত করে, VT কী-এর অধীনে অতিরিক্ত হিসেবে উত্তরে ভ্যালিডিটির মেয়াদ শেষ হওয়ার টাইমস্ট্যাম্প যোগ করে। A Policy VT কী ভ্যালু এক্সট্র্যাক্ট করতে পারে এবং বৈধতার মেয়াদ শেষ না হওয়া পর্যন্ত লাইসেন্স আবার চেক না করেই অ্যাপ্লিকেশনে অ্যাক্সেস দেওয়ার জন্য শর্তসাপেক্ষে এটি ব্যবহার করতে পারে।

লাইসেন্সের বৈধতা লাইসেন্সিং Policy-কে সিগন্যাল দেয় যে কখন লাইসেন্সিং সার্ভারের সাথে লাইসেন্সিং স্ট্যাটাস আবার চেক করতে হবে। কোনও অ্যাপ্লিকেশন ব্যবহারের জন্য লাইসেন্সপ্রাপ্ত কিনা তা বোঝানোর জন্য এটি নয়। অর্থাৎ, কোনও অ্যাপ্লিকেশনের লাইসেন্সের মেয়াদ শেষ হয়ে গেলে, তার অর্থ এই নয় যে অ্যাপ্লিকেশনটি আর ব্যবহার করা যাবে না — বরং, এর অর্থ হল Policy-কে সার্ভারের সাথে লাইসেন্সের স্ট্যাটাস আবার চেক করতে হবে। এর থেকে বোঝা যায় যে, লাইসেন্সের বৈধতার মেয়াদ শেষ না হওয়া পর্যন্ত, Policy-এর পক্ষে প্রাথমিক লাইসেন্সের স্ট্যাটাস স্থানীয়ভাবে ক্যাশে করা এবং সার্ভারে নতুন লাইসেন্স চেক করার অনুরোধ পাঠানোর পরিবর্তে ক্যাশে করা লাইসেন্সের স্ট্যাটাস ফিরিয়ে দেওয়া গ্রহণযোগ্য।

লাইসেন্সিং সার্ভার বৈধতার মেয়াদ ম্যানেজ করে যাতে Google Play-এর মাধ্যমে পেড অ্যাপ্লিকেশনের জন্য অফার করা রিফান্ডের সময়সীমা জুড়ে অ্যাপ্লিকেশনটি সঠিকভাবে লাইসেন্সিং এনফোর্স করতে পারে। অ্যাপ্লিকেশনটি কেনা হয়েছে কিনা এবং যদি তাই হয়, কতদিন আগে কেনা হয়েছে তার উপর ভিত্তি করে এটি ভ্যালিডিটির মেয়াদ সেট করে। বিশেষ করে, সার্ভার নিম্নলিখিতভাবে ভ্যালিডিটির মেয়াদ সেট করে:

  • পেড অ্যাপ্লিকেশনের ক্ষেত্রে, সার্ভার লাইসেন্সের প্রাথমিক বৈধতার মেয়াদ সেট করে যাতে লাইসেন্সের উত্তর ততক্ষণ পর্যন্ত বৈধ থাকে যতক্ষণ অ্যাপ্লিকেশনটি রিফান্ডযোগ্য থাকে। অ্যাপ্লিকেশনে লাইসেন্সিং Policy প্রাথমিক লাইসেন্স চেকের ফলাফল ক্যাশে করতে পারে এবং বৈধতার মেয়াদ শেষ না হওয়া পর্যন্ত লাইসেন্স আবার চেক করার প্রয়োজন হয় না।
  • কোনও অ্যাপ্লিকেশন আর রিফান্ড করা না গেলে, সার্ভার আরও বেশি ভ্যালিডিটির মেয়াদ সেট করে — সাধারণত বেশ কয়েক দিন।
  • ফ্রি অ্যাপ্লিকেশনের জন্য, সার্ভার বৈধতার সময়সীমা অনেক বেশি (long.MAX_VALUE) সেট করে। এর ফলে, Policy স্থানীয়ভাবে বৈধতার টাইমস্ট্যাম্প ক্যাশে করে রাখলে, ভবিষ্যতে অ্যাপ্লিকেশনের লাইসেন্স স্ট্যাটাস আবার চেক করার প্রয়োজন হয় না।

ServerManagedPolicy প্রয়োগ এক্সট্র্যাক্ট করা টাইমস্ট্যাম্প (mValidityTimestamp) প্রাথমিক শর্ত হিসেবে ব্যবহার করে যাতে ব্যবহারকারীকে অ্যাপ্লিকেশনে অ্যাক্সেস দেওয়ার আগে সার্ভারের সাথে লাইসেন্স স্ট্যাটাস আবার চেক করা হবে কিনা তা নির্ধারণ করা যায়।

আবার চেষ্টা করার সময়সীমা এবং সর্বাধিক কতবার চেষ্টা করা যাবে

কিছু ক্ষেত্রে, সিস্টেম বা নেটওয়ার্কের অবস্থার কারণে কোনও অ্যাপ্লিকেশনের লাইসেন্স চেক লাইসেন্সিং সার্ভারে পৌঁছাতে পারে না অথবা সার্ভারের উত্তর Google Play ক্লায়েন্ট অ্যাপ্লিকেশনে পৌঁছাতে পারে না। যেমন, ব্যবহারকারী কোনও সেল নেটওয়ার্ক বা ডেটা কানেকশন উপলভ্য না থাকলে—যেমন বিমানে থাকাকালীন—অথবা নেটওয়ার্ক কানেকশন অস্থির বা সেল সিগন্যাল দুর্বল হলে কোনও অ্যাপ্লিকেশন চালু করতে পারেন।

নেটওয়ার্ক সংক্রান্ত সমস্যার কারণে লাইসেন্স চেক করা না গেলে বা তাতে বাধা সৃষ্টি হলে, Google Play ক্লায়েন্ট Policy-এর processServerResponse() পদ্ধতিতে RETRY রেসপন্স কোড ফিরিয়ে দিয়ে অ্যাপ্লিকেশনকে বিজ্ঞপ্তি পাঠায়। সিস্টেমের সমস্যা হলে, যেমন অ্যাপ্লিকেশন Google Play-এর ILicensingService ইমপ্লিমেন্টেশনের সাথে বাইন্ড করতে না পারলে, LicenseChecker লাইব্রেরি নিজেই RETRY রেসপন্স কোড সহ Policy processServerResponse() মেথড কল করে।

সাধারণত, RETRY রেসপন্স কোড হল অ্যাপ্লিকেশনের জন্য একটি সিগন্যাল যে একটি সমস্যা ঘটেছে যা লাইসেন্স চেক সম্পূর্ণ হতে বাধা দিয়েছে।

Google Play সার্ভার, কোনও অ্যাপ্লিকেশনকে, ত্রুটিপূর্ণ পরিস্থিতিতে, "অতিরিক্ত সময়কাল" এবং সর্বাধিক কতবার চেষ্টা করা যাবে তা সেট করে, লাইসেন্সিং ম্যানেজ করতে সাহায্য করে। সার্ভার এই ভ্যালুগুলি সব লাইসেন্স চেক রেসপন্সে অন্তর্ভুক্ত করে, GT এবং GR কী-এর অধীনে অতিরিক্ত হিসেবে এগুলি যোগ করে।

Policy অ্যাপ্লিকেশনটি GT এবং GR অতিরিক্তগুলি বের করতে পারে এবং নিম্নলিখিতভাবে অ্যাপ্লিকেশনটিতে শর্তসাপেক্ষে অ্যাক্সেসের অনুমতি দিতে সেগুলি ব্যবহার করতে পারে:

  • লাইসেন্স চেক করার ফলে RETRY রেসপন্স পেলে, Policy-এর উচিত RETRY রেসপন্স কোড ক্যাশে করা এবং RETRY রেসপন্সের সংখ্যা বাড়ানো।
  • Policy-এর উচিত ব্যবহারকারীকে অ্যাপ্লিকেশন অ্যাক্সেস করার অনুমতি দেওয়া, তবে শর্ত হল আবার চেষ্টা করার অতিরিক্ত সময়কাল এখনও অ্যাক্টিভ থাকতে হবে অথবা আবার চেষ্টা করার সর্বাধিক সংখ্যায় পৌঁছানো যাবে না।

ServerManagedPolicy উপরে বর্ণনা করা অনুযায়ী সার্ভার-প্রদত্ত GT এবং GR ভ্যালু ব্যবহার করে। নিচের উদাহরণে allow() পদ্ধতিতে আবার চেষ্টা করার উত্তর শর্তসাপেক্ষে কীভাবে ম্যানেজ করা হয় তা দেখানো হয়েছে। RETRYটি উত্তরের সংখ্যা processServerResponse() পদ্ধতিতে মেইনটেইন করা হয়, দেখানো হয় না।

Kotlin

fun allowAccess(): Boolean {
    val ts = System.currentTimeMillis()
    return when(lastResponse) {
        LICENSED -> {
            // Check if the LICENSED response occurred within the validity timeout.
            ts <= validityTimestamp  // Cached LICENSED response is still valid.
        }
        RETRY -> {
            ts < lastResponseTime + MILLIS_PER_MINUTE &&
                    // Only allow access if we are within the retry period
                    // or we haven't used up our max retries.
                    (ts <= retryUntil || retryCount <= maxRetries)
        }
        else -> false
    }
}

জাভা

public boolean allowAccess() {
    long ts = System.currentTimeMillis();
    if (lastResponse == LicenseResponse.LICENSED) {
        // Check if the LICENSED response occurred within the validity timeout.
        if (ts <= validityTimestamp) {
            // Cached LICENSED response is still valid.
            return true;
        }
    } else if (lastResponse == LicenseResponse.RETRY &&
                ts < lastResponseTime + MILLIS_PER_MINUTE) {
        // Only allow access if we are within the retry period
        // or we haven't used up our max retries.
        return (ts <= retryUntil || retryCount <= maxRetries);
    }
    return false;
}