১. শুরু করার আগে
অ্যান্ড্রয়েড ১০ এবং ১১ ব্যবহারকারীদের তাদের ডিভাইসের অবস্থান অ্যাক্সেস করার ক্ষেত্রে অ্যাপগুলোর ওপর আরও বেশি নিয়ন্ত্রণ দেয়।
যখন অ্যান্ড্রয়েড ১১-এ চালিত কোনো অ্যাপ অবস্থানের অ্যাক্সেসের জন্য অনুরোধ করে, তখন ব্যবহারকারীদের কাছে চারটি বিকল্প থাকে:
- সব সময় দিন
- শুধুমাত্র অ্যাপ ব্যবহার করার সময় অনুমতি দিন (অ্যান্ড্রয়েড ১০-এ)
- শুধুমাত্র একবার (অ্যান্ড্রয়েড ১১-এ)
- অস্বীকার করুন
অ্যান্ড্রয়েড ১০

অ্যান্ড্রয়েড ১১

এই কোডল্যাবে আপনি শিখবেন কীভাবে লোকেশন আপডেট গ্রহণ করতে হয় এবং অ্যান্ড্রয়েডের যেকোনো সংস্করণে, বিশেষ করে অ্যান্ড্রয়েড ১০ ও ১১-এ, লোকেশন সাপোর্ট করতে হয়। কোডল্যাবটি শেষে, আপনি এমন একটি অ্যাপ তৈরি করতে পারবেন যা লোকেশন আপডেট সংগ্রহের জন্য বর্তমান সেরা পদ্ধতিগুলো অনুসরণ করে।
পূর্বশর্ত
আপনি যা করবেন
- অ্যান্ড্রয়েডে লোকেশন ব্যবহারের জন্য সেরা পদ্ধতিগুলো অনুসরণ করুন।
- ফোরগ্রাউন্ড লোকেশন পারমিশন পরিচালনা করুন (যখন আপনার অ্যাপটি ব্যবহারের সময় ব্যবহারকারী ডিভাইসের লোকেশন অ্যাক্সেস করার জন্য অনুরোধ করে)।
- বিদ্যমান একটি অ্যাপে লোকেশন সাবস্ক্রাইব ও আনসাবস্ক্রাইব করার কোড যোগ করে লোকেশন অ্যাক্সেসের অনুরোধ জানানোর সুবিধা যুক্ত করুন।
- ফোরগ্রাউন্ডে থাকা অবস্থায় বা ব্যবহারের সময় লোকেশন অ্যাক্সেস করার লজিক যোগ করে অ্যাপটিতে অ্যান্ড্রয়েড ১০ এবং ১১-এর জন্য সাপোর্ট যুক্ত করুন।
আপনার যা যা লাগবে
- কোডটি চালানোর জন্য অ্যান্ড্রয়েড স্টুডিও ৩.৪ বা তার পরবর্তী সংস্করণ প্রয়োজন।
- অ্যান্ড্রয়েড ১০ এবং ১১-এর ডেভেলপার প্রিভিউ চালিত একটি ডিভাইস/এমুলেটর
২. শুরু করা
স্টার্টার প্রজেক্ট রিপোটি ক্লোন করুন
আপনাকে যত দ্রুত সম্ভব কাজ শুরু করতে সাহায্য করার জন্য, আপনি এই স্টার্টার প্রজেক্টটির উপর ভিত্তি করে কাজ করতে পারেন। আপনার যদি Git ইনস্টল করা থাকে, তাহলে আপনি কেবল নিম্নলিখিত কমান্ডটি চালাতে পারেন:
git clone https://github.com/android/codelab-while-in-use-location
আপনি সরাসরি গিটহাব পেজটি দেখতে পারেন।
আপনার যদি গিট না থাকে, তাহলে আপনি প্রজেক্টটি একটি জিপ ফাইল হিসেবে পেতে পারেন:
প্রকল্পটি আমদানি করুন
অ্যান্ড্রয়েড স্টুডিও খুলুন, স্বাগত স্ক্রিন থেকে " একটি বিদ্যমান অ্যান্ড্রয়েড স্টুডিও প্রজেক্ট খুলুন " নির্বাচন করুন এবং প্রজেক্ট ডিরেক্টরিটি খুলুন।
প্রজেক্টটি লোড হওয়ার পরে, আপনি এমন একটি অ্যালার্টও দেখতে পারেন যে গিট আপনার সমস্ত লোকাল পরিবর্তন ট্র্যাক করছে না। আপনি 'ইগনোর' (Ignore ) ক্লিক করতে পারেন। (আপনি গিট রিপোতে কোনো পরিবর্তন পুশ করবেন না।)
আপনি যদি অ্যান্ড্রয়েড ভিউতে থাকেন, তাহলে প্রজেক্ট উইন্ডোর উপরের-বাম কোণায় নিচের ছবির মতো কিছু দেখতে পাবেন। (আপনি যদি প্রজেক্ট ভিউতে থাকেন, তবে একই জিনিস দেখতে আপনাকে প্রজেক্টটি এক্সপ্যান্ড করতে হবে।)

দুটি ফোল্ডার আছে ( base এবং complete )। প্রতিটি একটি 'মডিউল' নামে পরিচিত।
অনুগ্রহ করে মনে রাখবেন যে, প্রথমবার ব্যাকগ্রাউন্ডে প্রজেক্টটি কম্পাইল করতে অ্যান্ড্রয়েড স্টুডিওর কয়েক সেকেন্ড সময় লাগতে পারে। এই সময়ে, আপনি অ্যান্ড্রয়েড স্টুডিওর নিচের স্ট্যাটাস বারে নিম্নলিখিত বার্তাটি দেখতে পাবেন:

কোডে কোনো পরিবর্তন করার আগে অ্যান্ড্রয়েড স্টুডিও দ্বারা প্রজেক্টের ইন্ডেক্সিং এবং বিল্ড সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করুন। এর ফলে অ্যান্ড্রয়েড স্টুডিও সমস্ত প্রয়োজনীয় কম্পোনেন্টগুলো যুক্ত করতে পারবে।
যদি ‘ভাষা পরিবর্তন কার্যকর করার জন্য রিলোড করবেন?’ বা এই ধরনের কোনো প্রম্পট আসে, তাহলে ‘হ্যাঁ’ নির্বাচন করুন।
স্টার্টার প্রজেক্টটি বুঝুন
আপনি অ্যাপে লোকেশন অনুরোধ করার জন্য প্রস্তুত। base মডিউলটিকে শুরুর বিন্দু হিসেবে ব্যবহার করুন। প্রতিটি ধাপে base মডিউলে কোড যোগ করুন। এই কোডল্যাবটি শেষ করার সময়, base মডিউলের কোডটি complete মডিউলের বিষয়বস্তুর সাথে মিলে যাওয়া উচিত। আপনার কাজ পরীক্ষা করার জন্য অথবা কোনো সমস্যা হলে রেফারেন্স হিসেবে complete মডিউলটি ব্যবহার করা যেতে পারে।
মূল উপাদানগুলো হলো নিম্নরূপ:
-
MainActivity—অ্যাপটিকে ডিভাইসের অবস্থান অ্যাক্সেস করার অনুমতি দেওয়ার জন্য ব্যবহারকারীর UI। -
LocationService— এমন একটি সার্ভিস যা অবস্থানের পরিবর্তনে সাবস্ক্রাইব ও আনসাবস্ক্রাইব করে এবং ব্যবহারকারী অ্যাপের অ্যাক্টিভিটি থেকে অন্য কোথাও চলে গেলে (একটি নোটিফিকেশন সহ) নিজেকে ফোরগ্রাউন্ড সার্ভিসে উন্নীত করে। আপনি এখানে লোকেশন কোড যোগ করবেন। -
Util—Locationক্লাসের জন্য এক্সটেনশন ফাংশন যোগ করে এবংSharedPreferencesএ অবস্থান সংরক্ষণ করে (সরলীকৃত ডেটা লেয়ার)।
এমুলেটর সেটআপ
অ্যান্ড্রয়েড এমুলেটর সেট আপ করার বিষয়ে তথ্যের জন্য, 'এমুলেটরে চালান' দেখুন।
স্টার্টার প্রজেক্টটি চালান
আপনার অ্যাপটি চালান।
- আপনার অ্যান্ড্রয়েড ডিভাইসটি কম্পিউটারের সাথে সংযুক্ত করুন অথবা একটি এমুলেটর চালু করুন। (নিশ্চিত করুন যে ডিভাইসটিতে অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণ চলছে।)
- টুলবারে, ড্রপ-ডাউন সিলেক্টর থেকে
baseকনফিগারেশনটি নির্বাচন করুন এবং রান-এ ক্লিক করুন:

- আপনার ডিভাইসে নিম্নলিখিত অ্যাপটি প্রদর্শিত হতে লক্ষ্য করুন:

আপনি হয়তো লক্ষ্য করবেন যে আউটপুট স্ক্রিনে কোনো অবস্থানের তথ্য দেখা যাচ্ছে না। এর কারণ হলো, আপনি এখনো অবস্থানের কোডটি যোগ করেননি।
৩. অবস্থান যোগ করা
ধারণা
এই কোডল্যাবের মূল উদ্দেশ্য হলো আপনাকে দেখানো যে কীভাবে লোকেশন আপডেট গ্রহণ করতে হয় এবং পরবর্তীতে অ্যান্ড্রয়েড ১০ ও অ্যান্ড্রয়েড ১১ সমর্থন করা যায়।
তবে, কোডিং শুরু করার আগে মৌলিক বিষয়গুলো পর্যালোচনা করে নেওয়া ভালো।
অবস্থান অ্যাক্সেসের প্রকারভেদ
কোডল্যাবের শুরু থেকে লোকেশন অ্যাক্সেসের চারটি ভিন্ন বিকল্পের কথা আপনার মনে থাকতে পারে। দেখে নিন সেগুলোর অর্থ কী:
- শুধুমাত্র অ্যাপ ব্যবহার করার সময় অনুমতি দিন।
- বেশিরভাগ অ্যাপের জন্য এই অপশনটিই প্রস্তাবিত। "হোয়াইল-ইন-ইউজ" বা "ফোরগ্রাউন্ড অনলি" অ্যাক্সেস নামেও পরিচিত এই অপশনটি অ্যান্ড্রয়েড ১০-এ যোগ করা হয়েছিল এবং এটি ডেভেলপারদের শুধুমাত্র অ্যাপটি সক্রিয়ভাবে ব্যবহৃত হওয়ার সময় লোকেশন সংগ্রহ করার অনুমতি দেয়। একটি অ্যাপকে সক্রিয় বলে মনে করা হয় যদি নিম্নলিখিতগুলির মধ্যে যেকোনো একটি সত্য হয়:
- একটি কার্যকলাপ দৃশ্যমান।
- একটি ফোরগ্রাউন্ড সার্ভিস চলমান নোটিফিকেশন সহ চালু আছে।
- শুধুমাত্র একবার
- অ্যান্ড্রয়েড ১১-এ যুক্ত হওয়া এই ফিচারটি ‘শুধুমাত্র অ্যাপ ব্যবহারের সময় অনুমতি দিন’- এর মতোই, তবে এটি একটি সীমিত সময়ের জন্য কার্যকর। আরও তথ্যের জন্য, ‘এককালীন অনুমতি’ (One-time permissions ) দেখুন।
- অস্বীকার করুন
- এই বিকল্পটি অবস্থানের তথ্যে প্রবেশাধিকার রোধ করে।
- সব সময় দিন
- এই অপশনটি সব সময় লোকেশন অ্যাক্সেসের অনুমতি দেয়, কিন্তু অ্যান্ড্রয়েড ১০ এবং তার পরবর্তী সংস্করণগুলোর জন্য একটি অতিরিক্ত পারমিশন প্রয়োজন । আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার একটি বৈধ ব্যবহারের ক্ষেত্র (use case) আছে এবং আপনি লোকেশন পলিসিগুলো মেনে চলছেন। এই কোডল্যাবে এই অপশনটি নিয়ে আলোচনা করা হবে না, কারণ এটি একটি বিরল ব্যবহারের ক্ষেত্র। তবে, যদি আপনার একটি বৈধ ব্যবহারের ক্ষেত্র থাকে এবং আপনি বুঝতে চান কিভাবে ব্যাকগ্রাউন্ডে লোকেশন অ্যাক্সেস করা সহ সব সময় লোকেশন সঠিকভাবে পরিচালনা করতে হয়, তাহলে LocationUpdatesBackgroundKotlin স্যাম্পলটি পর্যালোচনা করুন।
পরিষেবা, ফোরগ্রাউন্ড পরিষেবা এবং বাইন্ডিং
শুধুমাত্র অ্যাপ ব্যবহারের সময় লোকেশন আপডেট পাওয়ার সুযোগকে সম্পূর্ণরূপে সমর্থন করতে, ব্যবহারকারী যখন আপনার অ্যাপ থেকে অন্য কোথাও চলে যান, সেই বিষয়টিও আপনাকে বিবেচনা করতে হবে। যদি আপনি সেই পরিস্থিতিতেও আপডেট পেতে চান, তাহলে আপনাকে একটি ফোরগ্রাউন্ড Service তৈরি করে সেটিকে একটি Notification সাথে যুক্ত করতে হবে।
এছাড়াও, আপনার অ্যাপটি দৃশ্যমান থাকা অবস্থায় এবং ব্যবহারকারী অ্যাপ থেকে অন্য কোথাও চলে গেলে লোকেশন আপডেটের অনুরোধ করার জন্য যদি আপনি একই Service ব্যবহার করতে চান, তাহলে আপনাকে সেই Service UI এলিমেন্টের সাথে বাইন্ড/আনবাইন্ড করতে হবে।
যেহেতু এই কোডল্যাবটি শুধুমাত্র অবস্থানের আপডেট পাওয়ার উপর আলোকপাত করে, তাই আপনার প্রয়োজনীয় সমস্ত কোড ForegroundOnlyLocationService.kt ক্লাসে পাবেন। তারা কীভাবে একসাথে কাজ করে তা দেখার জন্য আপনি সেই ক্লাস এবং MainActivity.kt ব্রাউজ করতে পারেন।
আরও তথ্যের জন্য, পরিষেবাগুলির সংক্ষিপ্ত বিবরণ এবং আবদ্ধ পরিষেবাগুলির সংক্ষিপ্ত বিবরণ দেখুন।
অনুমতি
NETWORK_PROVIDER বা GPS_PROVIDER থেকে লোকেশন আপডেট পেতে হলে, আপনাকে অবশ্যই আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট ফাইলে যথাক্রমে ACCESS_COARSE_LOCATION অথবা ACCESS_FINE_LOCATION পারমিশন ঘোষণা করে ব্যবহারকারীর অনুমতি চাইতে হবে। এই পারমিশনগুলো ছাড়া, আপনার অ্যাপ রানটাইমে লোকেশন অ্যাক্সেসের জন্য অনুরোধ করতে পারবে না।
আপনার অ্যাপটি যখন অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণে চালিত কোনো ডিভাইসে ব্যবহার করা হয়, তখন এই অনুমতিগুলো 'শুধুমাত্র একবার' এবং 'শুধুমাত্র অ্যাপটি ব্যবহার করার সময় অনুমতি দিন' ক্ষেত্রগুলোকে অন্তর্ভুক্ত করে।
অবস্থান
আপনার অ্যাপ com.google.android.gms.location প্যাকেজের ক্লাসগুলোর মাধ্যমে সমর্থিত লোকেশন সার্ভিসগুলো অ্যাক্সেস করতে পারে।
প্রধান শ্রেণীগুলো দেখুন:
-
FusedLocationProviderClient - এটি অবস্থান কাঠামোর কেন্দ্রীয় উপাদান। একবার তৈরি হয়ে গেলে, এটি ব্যবহার করে অবস্থানের হালনাগাদ জানতে ও সর্বশেষ জানা অবস্থানটি পাওয়া যায়।
-
LocationRequest - এটি একটি ডেটা অবজেক্ট যা অনুরোধের জন্য পরিষেবার মান-সংক্রান্ত প্যারামিটার (আপডেটের ব্যবধান, অগ্রাধিকার এবং নির্ভুলতা) ধারণ করে। আপনি যখন অবস্থান আপডেটের জন্য অনুরোধ করেন, তখন এটি
FusedLocationProviderClientকাছে পাঠানো হয়। -
LocationCallback - ডিভাইসের অবস্থান পরিবর্তিত হলে বা আর নির্ধারণ করা না গেলে নোটিফিকেশন পাওয়ার জন্য এটি ব্যবহৃত হয়। এতে একটি
LocationResultপাঠানো হয়, যেখান থেকে আপনি আপনার ডেটাবেসে সংরক্ষণ করার জন্যLocationপেতে পারেন।
এখন যেহেতু আপনি কী করছেন সে সম্পর্কে একটি প্রাথমিক ধারণা পেয়েছেন, কোডটি লেখা শুরু করুন!
৪. অবস্থানের বৈশিষ্ট্য যোগ করুন
এই কোডল্যাবটি সবচেয়ে প্রচলিত লোকেশন অপশনটির উপর আলোকপাত করে: শুধুমাত্র অ্যাপটি ব্যবহার করার সময় অনুমতি দিন ।
অবস্থানের আপডেট পেতে হলে, আপনার অ্যাপে অবশ্যই একটি দৃশ্যমান অ্যাক্টিভিটি অথবা ফোরগ্রাউন্ডে (নোটিফিকেশন সহ) চালু থাকা একটি সার্ভিস থাকতে হবে।
অনুমতি
এই কোডল্যাবের উদ্দেশ্য হলো লোকেশন আপডেট কীভাবে গ্রহণ করতে হয় তা দেখানো, লোকেশন পারমিশন কীভাবে অনুরোধ করতে হয় তা নয়, তাই পারমিশন-ভিত্তিক কোডটি আপনার জন্য আগেই লেখা আছে। আপনি যদি বিষয়টি আগে থেকেই বুঝে থাকেন, তবে নির্দ্বিধায় এটি এড়িয়ে যেতে পারেন।
নিম্নলিখিতগুলি হলো অনুমতির মূল বিষয়গুলি (এই অংশের জন্য কোনো পদক্ষেপের প্রয়োজন নেই):
-
AndroidManifest.xmlএ আপনি কোন অনুমতি ব্যবহার করেন তা ঘোষণা করুন। - অবস্থানের তথ্য অ্যাক্সেস করার চেষ্টা করার আগে, ব্যবহারকারী আপনার অ্যাপকে এর অনুমতি দিয়েছেন কিনা তা যাচাই করে নিন। যদি আপনার অ্যাপ এখনও অনুমতি না পেয়ে থাকে, তবে অ্যাক্সেসের জন্য অনুরোধ করুন।
- ব্যবহারকারীর অনুমতির পছন্দটি পরিচালনা করুন। (এই কোডটি আপনি
MainActivity.ktএ দেখতে পাবেন।)
আপনি যদি AndroidManifest.xml অথবা MainActivity.kt এ TODO: Step 1.0, Review Permissions খুঁজে দেখেন, তাহলে পারমিশনের জন্য লেখা সমস্ত কোড দেখতে পাবেন।
আরও তথ্যের জন্য, অনুমতিসমূহের সংক্ষিপ্ত বিবরণ দেখুন।
এবার, কিছু লোকেশন কোড লেখা শুরু করুন।
অবস্থান আপডেটের জন্য প্রয়োজনীয় মূল ভেরিয়েবলগুলো পর্যালোচনা করুন।
base মডিউলে, TODO: Step 1.1, Review variables in the খুঁজুন।
ForegroundOnlyLocationService.kt ফাইল।
এই ধাপে কোনো পদক্ষেপ নেওয়ার প্রয়োজন নেই। অবস্থানের আপডেট গ্রহণ করার জন্য আপনি যে মূল ক্লাস এবং ভেরিয়েবলগুলো ব্যবহার করেন, তা বোঝার জন্য আপনাকে শুধু কমেন্টসহ নিচের কোড ব্লকটি পর্যালোচনা করতে হবে।
// TODO: Step 1.1, Review variables (no changes).
// FusedLocationProviderClient - Main class for receiving location updates.
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
// LocationRequest - Requirements for the location updates, i.e., how often you
// should receive updates, the priority, etc.
private lateinit var locationRequest: LocationRequest
// LocationCallback - Called when FusedLocationProviderClient has a new Location.
private lateinit var locationCallback: LocationCallback
// Used only for local storage of the last known location. Usually, this would be saved to your
// database, but because this is a simplified sample without a full database, we only need the
// last location to create a Notification if the user navigates away from the app.
private var currentLocation: Location? = null
FusedLocationProviderClient প্রারম্ভিককরণ পর্যালোচনা করুন
base মডিউলে, TODO: Step 1.2 খুঁজুন, ForegroundOnlyLocationService.kt ফাইলে TODO: Step 1.2, Review the FusedLocationProviderClient । আপনার কোডটি দেখতে অনেকটা এইরকম হবে:
// TODO: Step 1.2, Review the FusedLocationProviderClient.
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
পূর্ববর্তী মন্তব্যগুলিতে যেমন উল্লেখ করা হয়েছে, এটিই লোকেশন আপডেট পাওয়ার মূল ক্লাস। ভেরিয়েবলটি আপনার জন্য ইতিমধ্যেই ইনিশিয়ালাইজ করা আছে, কিন্তু এটি কীভাবে ইনিশিয়ালাইজ করা হয়েছে তা বোঝার জন্য কোডটি পর্যালোচনা করা গুরুত্বপূর্ণ। পরবর্তীতে লোকেশন আপডেটের অনুরোধ করার জন্য আপনি এখানে কিছু কোড যোগ করবেন।
LocationRequest শুরু করুন
-
baseমডিউলে, TODO: Step 1.3 খুঁজুন,ForegroundOnlyLocationService.ktফাইলেTODO: Step 1.3, Create a LocationRequest। - কমেন্টের পরে নিম্নলিখিত কোডটি যোগ করুন।
LocationRequest ইনিশিয়ালাইজেশন কোডটি আপনার অনুরোধের জন্য প্রয়োজনীয় অতিরিক্ত কোয়ালিটি অফ সার্ভিস প্যারামিটারগুলো (যেমন—অন্তরাল, সর্বোচ্চ অপেক্ষার সময় এবং অগ্রাধিকার) যোগ করে।
// TODO: Step 1.3, Create a LocationRequest.
locationRequest = LocationRequest.create().apply {
// Sets the desired interval for active location updates. This interval is inexact. You
// may not receive updates at all if no location sources are available, or you may
// receive them less frequently than requested. You may also receive updates more
// frequently than requested if other applications are requesting location at a more
// frequent interval.
//
// IMPORTANT NOTE: Apps running on Android 8.0 and higher devices (regardless of
// targetSdkVersion) may receive updates less frequently than this interval when the app
// is no longer in the foreground.
interval = TimeUnit.SECONDS.toMillis(60)
// Sets the fastest rate for active location updates. This interval is exact, and your
// application will never receive updates more frequently than this value.
fastestInterval = TimeUnit.SECONDS.toMillis(30)
// Sets the maximum time when batched location updates are delivered. Updates may be
// delivered sooner than this interval.
maxWaitTime = TimeUnit.MINUTES.toMillis(2)
priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
- প্রতিটি কীভাবে কাজ করে তা বোঝার জন্য মন্তব্যগুলো পড়ুন।
LocationCallback শুরু করুন
-
baseমডিউলে,ForegroundOnlyLocationService.ktফাইলেTODO: Step 1.4, Initialize the LocationCallbackখুঁজুন। - কমেন্টের পরে নিম্নলিখিত কোডটি যোগ করুন।
// TODO: Step 1.4, Initialize the LocationCallback.
locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
super.onLocationResult(locationResult)
// Normally, you want to save a new location to a database. We are simplifying
// things a bit and just saving it as a local variable, as we only need it again
// if a Notification is created (when the user navigates away from app).
currentLocation = locationResult.lastLocation
// Notify our Activity that a new location was added. Again, if this was a
// production app, the Activity would be listening for changes to a database
// with new locations, but we are simplifying things a bit to focus on just
// learning the location side of things.
val intent = Intent(ACTION_FOREGROUND_ONLY_LOCATION_BROADCAST)
intent.putExtra(EXTRA_LOCATION, currentLocation)
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
// Updates notification content if this service is running as a foreground
// service.
if (serviceRunningInForeground) {
notificationManager.notify(
NOTIFICATION_ID,
generateNotification(currentLocation))
}
}
}
এখানে আপনি যে LocationCallback তৈরি করবেন, সেটিই হলো সেই কলব্যাক যা FusedLocationProviderClient একটি নতুন লোকেশন আপডেট উপলব্ধ হলে কল করবে।
আপনার কলব্যাকে, আপনি প্রথমে একটি LocationResult অবজেক্ট ব্যবহার করে সর্বশেষ অবস্থানটি সংগ্রহ করেন। এরপর, আপনি একটি লোকাল ব্রডকাস্ট ব্যবহার করে আপনার Activity নতুন অবস্থান সম্পর্কে অবহিত করেন (যদি এটি সক্রিয় থাকে) অথবা এই সার্ভিসটি যদি একটি ফোরগ্রাউন্ড Service হিসেবে চলে, তবে Notification আপডেট করেন।
- প্রতিটি অংশের কাজ বোঝার জন্য মন্তব্যগুলো পড়ুন।
অবস্থান পরিবর্তনের জন্য সাবস্ক্রাইব করুন
এখন যেহেতু আপনি সবকিছু ইনিশিয়ালাইজ করেছেন, আপনাকে FusedLocationProviderClient কে জানাতে হবে যে আপনি আপডেট পেতে চান।
-
baseমডিউলে,ForegroundOnlyLocationService.ktফাইলেরStep 1.5, Subscribe to location changesঅংশটি খুঁজুন। - কমেন্টের পরে নিম্নলিখিত কোডটি যোগ করুন।
// TODO: Step 1.5, Subscribe to location changes.
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
requestLocationUpdates() কলটি FusedLocationProviderClient কে জানিয়ে দেয় যে আপনি অবস্থানের আপডেট পেতে চান।
আপনি সম্ভবত LocationRequest এবং LocationCallback চিনতে পারছেন, যা আপনি আগে সংজ্ঞায়িত করেছিলেন। এগুলি FusedLocationProviderClient আপনার অনুরোধের জন্য কোয়ালিটি-অফ-সার্ভিস প্যারামিটারগুলি এবং কোনো আপডেট পেলে কাকে কল করতে হবে, তা জানিয়ে দেয়। সবশেষে, Looper অবজেক্টটি কলব্যাকের জন্য থ্রেড নির্দিষ্ট করে।
আপনি হয়তো আরও লক্ষ্য করবেন যে এই কোডটি একটি try/catch স্টেটমেন্টের মধ্যে রয়েছে। এই মেথডটির জন্য এমন একটি ব্লকের প্রয়োজন, কারণ আপনার অ্যাপের লোকেশন তথ্য অ্যাক্সেস করার অনুমতি না থাকলে একটি SecurityException ঘটে।
অবস্থান পরিবর্তন থেকে সদস্যতা বাতিল করুন
যখন অ্যাপটির আর অবস্থানের তথ্যে অ্যাক্সেসের প্রয়োজন হয় না, তখন লোকেশন আপডেট থেকে আনসাবস্ক্রাইব করা গুরুত্বপূর্ণ।
-
baseমডিউলে,ForegroundOnlyLocationService.ktফাইলেরTODO: Step 1.6, Unsubscribe to location changesখুঁজুন। - কমেন্টের পরে নিম্নলিখিত কোডটি যোগ করুন।
// TODO: Step 1.6, Unsubscribe to location changes.
val removeTask = fusedLocationProviderClient.removeLocationUpdates(locationCallback)
removeTask.addOnCompleteListener { task ->
if (task.isSuccessful) {
Log.d(TAG, "Location Callback removed.")
stopSelf()
} else {
Log.d(TAG, "Failed to remove Location Callback.")
}
}
removeLocationUpdates() মেথডটি একটি টাস্ক সেট আপ করে, যা FusedLocationProviderClient জানিয়ে দেয় যে আপনি আপনার LocationCallback জন্য আর লোকেশন আপডেট পেতে চান না। addOnCompleteListener() মেথডটি কাজটি সম্পন্ন হওয়ার জন্য কলব্যাক প্রদান করে এবং Task সম্পাদন করে।
আগের ধাপের মতোই, আপনি হয়তো লক্ষ্য করেছেন যে এই কোডটি একটি try/catch স্টেটমেন্টের মধ্যে রয়েছে। এই মেথডটির জন্য এমন একটি ব্লকের প্রয়োজন, কারণ আপনার অ্যাপের লোকেশন তথ্য অ্যাক্সেস করার অনুমতি না থাকলে একটি SecurityException ঘটে।
আপনার মনে প্রশ্ন জাগতে পারে যে, যে মেথডগুলোতে সাবস্ক্রাইব/আনসাবস্ক্রাইব কোড থাকে, সেগুলো কখন কল করা হয়। ব্যবহারকারী যখন বাটনটিতে ট্যাপ করেন, তখন মেইন ক্লাসে এগুলো ট্রিগার হয়। আপনি যদি এটি দেখতে চান, তাহলে MainActivity.kt ক্লাসটি দেখুন।
অ্যাপটি চালান
অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপটি চালান এবং লোকেশন বাটনটি ব্যবহার করে দেখুন।
আউটপুট স্ক্রিনে আপনি অবস্থানের তথ্য দেখতে পাবেন। এটি অ্যান্ড্রয়েড ৯-এর জন্য একটি সম্পূর্ণ কার্যকরী অ্যাপ।


৫. অ্যান্ড্রয়েড ১০ সমর্থন করে
এই অংশে আপনি অ্যান্ড্রয়েড ১০-এর জন্য সমর্থন যোগ করবেন।
আপনার অ্যাপটি ইতিমধ্যেই অবস্থানের পরিবর্তন গ্রহণ করার জন্য সাবস্ক্রাইব করা আছে, তাই খুব বেশি কাজ করার প্রয়োজন নেই।
প্রকৃতপক্ষে, আপনাকে শুধু নির্দিষ্ট করে দিতে হবে যে আপনার ফোরগ্রাউন্ড সার্ভিসটি অবস্থান নির্ণয়ের উদ্দেশ্যে ব্যবহৃত হচ্ছে।
টার্গেট এসডিকে ২৯
-
baseমডিউলেরbuild.gradleফাইলেTODO: Step 2.1, Target Android 10 and then Android 11.খুঁজুন। - এই পরিবর্তনগুলো করুন:
-
targetSdkVersionকে29এ সেট করুন।
আপনার কোডটি দেখতে অনেকটা এইরকম হবে:
android {
// TODO: Step 2.1, Target Android 10 and then Android 11.
compileSdkVersion 29
defaultConfig {
applicationId "com.example.android.whileinuselocation"
minSdkVersion 26
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
...
}
এটি করার পরে, আপনাকে আপনার প্রজেক্ট সিঙ্ক করতে বলা হবে। ‘সিঙ্ক নাও’ (Sync Now)-এ ক্লিক করুন।

এরপরে, আপনার অ্যাপটি অ্যান্ড্রয়েড ১০-এর জন্য প্রায় প্রস্তুত হয়ে যাবে।
ফোরগ্রাউন্ড সার্ভিস টাইপ যোগ করুন
অ্যান্ড্রয়েড ১০-এ, ব্যবহারের সময় লোকেশন অ্যাক্সেসের প্রয়োজন হলে আপনার ফোরগ্রাউন্ড সার্ভিসের ধরন উল্লেখ করা আবশ্যক। আপনার ক্ষেত্রে, এটি লোকেশন তথ্য পেতে ব্যবহৃত হচ্ছে।
base মডিউলে, TODO: 2.2, Add foreground service type in the AndroidManifest.xml খুঁজুন এবং <service> এলিমেন্টে নিম্নলিখিত কোডটি যোগ করুন:
android:foregroundServiceType="location"
আপনার কোডটি দেখতে অনেকটা এইরকম হবে:
<application>
...
<!-- Foreground services in Android 10+ require type. -->
<!-- TODO: 2.2, Add foreground service type. -->
<service
android:name="com.example.android.whileinuselocation.ForegroundOnlyLocationService"
android:enabled="true"
android:exported="false"
android:foregroundServiceType="location" />
</application>
ব্যাস! আপনার অ্যাপটি অ্যান্ড্রয়েডের লোকেশন সংক্রান্ত সেরা অনুশীলনগুলো অনুসরণ করার মাধ্যমে 'ব্যবহারকালীন' অবস্থার জন্য অ্যান্ড্রয়েড ১০-এর লোকেশন সমর্থন করে।
অ্যাপটি চালান
অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপটি চালান এবং লোকেশন বাটনটি ব্যবহার করে দেখুন।
সবকিছু আগের মতোই কাজ করার কথা, তবে এখন এটি অ্যান্ড্রয়েড ১০-এ কাজ করে। আপনি যদি আগে লোকেশনের অনুমতিগুলো গ্রহণ না করে থাকেন, তাহলে এখন আপনি অনুমতির স্ক্রিনটি দেখতে পাবেন!



৬. অ্যান্ড্রয়েড ১১ সমর্থন করে
এই অংশে, আপনি অ্যান্ড্রয়েড ১১-কে লক্ষ্য করবেন।
দারুণ খবর, build.gradle ফাইলটি ছাড়া আর কোনো ফাইলে পরিবর্তন করার প্রয়োজন নেই!
টার্গেট এসডিকে ১১
-
baseমডিউলেরbuild.gradleফাইলেTODO: Step 2.1, Target SDKঅংশটি খুঁজুন। - এই পরিবর্তনগুলো করুন:
-
compileSdkVersion30এ -
targetSdkVersion30এ
আপনার কোডটি দেখতে অনেকটা এইরকম হবে:
android {
TODO: Step 2.1, Target Android 10 and then Android 11.
compileSdkVersion 30
defaultConfig {
applicationId "com.example.android.whileinuselocation"
minSdkVersion 26
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
...
}
এটি করার পরে, আপনাকে আপনার প্রজেক্ট সিঙ্ক করতে বলা হবে। ‘সিঙ্ক নাও’ (Sync Now)-এ ক্লিক করুন।

এরপরে, আপনার অ্যাপটি অ্যান্ড্রয়েড ১১-এর জন্য প্রস্তুত হয়ে যাবে!
অ্যাপটি চালান
অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপটি চালান এবং বাটনটিতে ক্লিক করার চেষ্টা করুন।
সবকিছু আগের মতোই কাজ করার কথা, তবে এখন এটি অ্যান্ড্রয়েড ১১-এ কাজ করে। আপনি যদি আগে লোকেশনের অনুমতিগুলো গ্রহণ না করে থাকেন, তাহলে এখন আপনি অনুমতির স্ক্রিনটি দেখতে পাবেন!


৭. অ্যান্ড্রয়েডের জন্য অবস্থান কৌশল
এই কোডল্যাবে দেখানো পদ্ধতিতে লোকেশন পারমিশন চেক ও রিকোয়েস্ট করার মাধ্যমে, আপনার অ্যাপ ডিভাইসের লোকেশন সংক্রান্ত তার অ্যাক্সেস লেভেলের উপর সফলভাবে নজর রাখতে পারবে।
এই পৃষ্ঠায় অবস্থান অনুমতি সম্পর্কিত কয়েকটি গুরুত্বপূর্ণ সেরা অনুশীলন তালিকাভুক্ত করা হয়েছে। আপনার ব্যবহারকারীদের ডেটা কীভাবে সুরক্ষিত রাখবেন সে সম্পর্কে আরও তথ্যের জন্য, অ্যাপ অনুমতির সেরা অনুশীলনগুলি দেখুন।
শুধু আপনার প্রয়োজনীয় অনুমতিগুলোই চান।
শুধুমাত্র প্রয়োজন হলেই অনুমতি চান। উদাহরণস্বরূপ:
- অত্যন্ত জরুরি না হলে অ্যাপ চালু করার সময় অবস্থানের অনুমতি চাইবেন না।
- আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১০ বা তার পরবর্তী সংস্করণকে টার্গেট করে এবং তাতে কোনো ফোরগ্রাউন্ড সার্ভিস থাকে, তাহলে ম্যানিফেস্টে
foregroundServiceTypeহিসেবে"location"ডিক্লেয়ার করুন। - "ব্যবহারকারীর অবস্থানে নিরাপদ ও অধিক স্বচ্ছ অ্যাক্সেস" অংশে বর্ণিত বৈধ ব্যবহারের ক্ষেত্র না থাকলে ব্যাকগ্রাউন্ডে অবস্থানের অনুমতি চাইবেন না।
অনুমতি না দেওয়া হলে স্বাভাবিক অবনতি সমর্থন করুন।
ব্যবহারকারীর ভালো অভিজ্ঞতা বজায় রাখতে, আপনার অ্যাপটি এমনভাবে ডিজাইন করুন যাতে এটি নিম্নলিখিত পরিস্থিতিগুলো সুন্দরভাবে সামলাতে পারে:
- আপনার অ্যাপের অবস্থান সংক্রান্ত তথ্যে কোনো প্রবেশাধিকার নেই।
- ব্যাকগ্রাউন্ডে চলার সময় আপনার অ্যাপটির লোকেশন তথ্যে অ্যাক্সেস থাকে না।
৮. অভিনন্দন
আপনি শিখেছেন কীভাবে সেরা পদ্ধতিগুলো মাথায় রেখে অ্যান্ড্রয়েডে লোকেশন আপডেট পেতে হয়!
আরও জানুন
- আপনার যদি একটি বৈধ ব্যবহারের ক্ষেত্র থাকে, তবে ব্যাকগ্রাউন্ড লোকেশন ব্যবহারের একটি সম্পূর্ণ নমুনা নিচে দেওয়া হলো।
- অবস্থান আপডেটের জন্য অনুরোধ করুন