Kotlin-এর মাধ্যমে Android-এ অবস্থানের আপডেট পান

অ্যান্ড্রয়েড 10 এবং 11 ব্যবহারকারীদের তাদের ডিভাইসের অবস্থানে তাদের অ্যাপের অ্যাক্সেসের উপর আরও নিয়ন্ত্রণ দেয়।

যখন Android 11-এ চলমান একটি অ্যাপ লোকেশন অ্যাক্সেসের অনুরোধ করে, ব্যবহারকারীদের কাছে চারটি বিকল্প থাকে:

  • সব সময় অনুমতি দিন
  • শুধুমাত্র অ্যাপ ব্যবহার করার সময় অনুমতি দিন (Android 10 এ)
  • শুধুমাত্র একবার (Android 11 এ)
  • অস্বীকার করুন

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

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

এই কোডল্যাবে, আপনি কীভাবে লোকেশন আপডেট পাবেন এবং অ্যান্ড্রয়েডের যেকোনো সংস্করণে, বিশেষ করে অ্যান্ড্রয়েড 10 এবং 11-এ কীভাবে লোকেশন সমর্থন করবেন তা শিখবেন। কোডল্যাবের শেষে, আপনি একটি অ্যাপ পাওয়ার আশা করতে পারেন যা পুনরুদ্ধারের জন্য বর্তমান সেরা অনুশীলনগুলি অনুসরণ করে। অবস্থান আপডেট।

পূর্বশর্ত

আপনি কি করবেন

  • Android এ অবস্থানের জন্য সর্বোত্তম অনুশীলন অনুসরণ করুন।
  • ফোরগ্রাউন্ড অবস্থানের অনুমতিগুলি পরিচালনা করুন (যখন ব্যবহারকারী অনুরোধ করে যে আপনার অ্যাপটি ব্যবহার করা অবস্থায় ডিভাইসের অবস্থান অ্যাক্সেস করার জন্য)।
  • অবস্থানে সদস্যতা নেওয়া এবং সদস্যতা ত্যাগ করার জন্য কোড যোগ করে অবস্থান অ্যাক্সেসের অনুরোধের জন্য সমর্থন যোগ করতে একটি বিদ্যমান অ্যাপ পরিবর্তন করুন।
  • ফোরগ্রাউন্ড লোকেশনে বা ব্যবহারের সময় লোকেশন অ্যাক্সেস করার জন্য যুক্তি যোগ করে Android 10 এবং 11-এর জন্য অ্যাপে সমর্থন যোগ করুন।

আপনি কি প্রয়োজন হবে

  • অ্যান্ড্রয়েড স্টুডিও 3.4 বা তার পরে কোড চালানোর জন্য
  • Android 10 এবং 11-এর ডেভেলপার প্রিভিউ চালানোর জন্য একটি ডিভাইস/এমুলেটর

স্টার্টার প্রজেক্ট রেপো ক্লোন করুন

যত তাড়াতাড়ি সম্ভব আপনাকে শুরু করতে, আপনি এই স্টার্টার প্রকল্পটি তৈরি করতে পারেন। আপনার যদি গিট ইনস্টল থাকে তবে আপনি কেবল নিম্নলিখিত কমান্ডটি চালাতে পারেন:

 git clone https://github.com/googlecodelabs/while-in-use-location

নির্দ্বিধায় সরাসরি GitHub পৃষ্ঠাটি দেখুন।

আপনার যদি গিট না থাকে তবে আপনি একটি জিপ ফাইল হিসাবে প্রকল্পটি পেতে পারেন:

জিপ ডাউনলোড করুন

প্রকল্পটি আমদানি করুন

অ্যান্ড্রয়েড স্টুডিও খুলুন, স্বাগত স্ক্রীন থেকে " একটি বিদ্যমান অ্যান্ড্রয়েড স্টুডিও প্রকল্প খুলুন " নির্বাচন করুন এবং প্রকল্প ডিরেক্টরি খুলুন।

প্রকল্পটি লোড হওয়ার পরে, আপনি একটি সতর্কতাও দেখতে পারেন যে গিট আপনার সমস্ত স্থানীয় পরিবর্তনগুলি ট্র্যাক করছে না। আপনি উপেক্ষা ক্লিক করতে পারেন। (আপনি গিট রেপোতে কোনও পরিবর্তন ফিরিয়ে আনবেন না।)

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

দুটি ফোল্ডার আছে ( base এবং complete )। প্রতিটি একটি "মডিউল" হিসাবে পরিচিত।

অনুগ্রহ করে মনে রাখবেন যে অ্যান্ড্রয়েড স্টুডিও প্রথমবারের মতো পটভূমিতে প্রকল্পটি কম্পাইল করতে কয়েক সেকেন্ড সময় নিতে পারে। এই সময়ের মধ্যে, আপনি Android স্টুডিওর নীচে স্ট্যাটাস বারে নিম্নলিখিত বার্তাটি দেখতে পাবেন:

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

আপনি যদি একটি প্রম্পট পান যে ভাষা পরিবর্তনগুলি কার্যকর হওয়ার জন্য পুনরায় লোড করুন? বা অনুরূপ কিছু, হ্যাঁ নির্বাচন করুন।

স্টার্টার প্রজেক্ট বুঝুন

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

মূল উপাদানগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • MainActivity —ব্যবহারকারীর জন্য অ্যাপটিকে ডিভাইসের অবস্থান অ্যাক্সেস করার অনুমতি দেওয়ার জন্য UI
  • LocationService — এমন পরিষেবা যা সদস্যতা নেয় এবং অবস্থান পরিবর্তনের সদস্যতা ত্যাগ করে, এবং ব্যবহারকারী অ্যাপের কার্যকলাপ থেকে দূরে সরে গেলে নিজেকে একটি অগ্রভাগের পরিষেবাতে (একটি বিজ্ঞপ্তি সহ) প্রচার করে৷ আপনি এখানে অবস্থান কোড যোগ করুন.
  • UtilLocation শ্রেণীর জন্য এক্সটেনশন ফাংশন যোগ করে এবং SharedPreferences (সরলীকৃত ডেটা স্তর) এ অবস্থান সংরক্ষণ করে।

এমুলেটর সেটআপ

একটি অ্যান্ড্রয়েড এমুলেটর সেট আপ সম্পর্কে তথ্যের জন্য, এমুলেটর চালান দেখুন।

স্টার্টার প্রকল্প চালান

আপনার অ্যাপ চালান।

  1. আপনার কম্পিউটারে আপনার অ্যান্ড্রয়েড ডিভাইসটি সংযুক্ত করুন বা একটি এমুলেটর শুরু করুন৷ (নিশ্চিত করুন যে ডিভাইসটি Android 10 বা উচ্চতর সংস্করণে চলছে।)
  2. টুলবারে, ড্রপ-ডাউন নির্বাচক থেকে base কনফিগারেশন নির্বাচন করুন এবং রান ক্লিক করুন:


  1. লক্ষ্য করুন যে আপনার ডিভাইসে নিম্নলিখিত অ্যাপটি উপস্থিত হয়েছে:


আপনি লক্ষ্য করতে পারেন যে আউটপুট স্ক্রিনে কোনও অবস্থানের তথ্য উপস্থিত হয় না। কারণ আপনি এখনও লোকেশন কোড যোগ করেননি।

ধারণা

এই কোডল্যাবের ফোকাস হল আপনাকে দেখানো যে কিভাবে লোকেশন আপডেট পাবেন এবং অবশেষে Android 10 এবং Android 11 সমর্থন করবেন।

যাইহোক, আপনি কোডিং শুরু করার আগে, মূল বিষয়গুলি পর্যালোচনা করা বোধগম্য।

অবস্থান অ্যাক্সেসের ধরন

কোডল্যাবের শুরু থেকে লোকেশন অ্যাক্সেসের জন্য আপনি চারটি ভিন্ন বিকল্প মনে রাখতে পারেন। তারা কি বোঝায় তা একবার দেখুন:

  • শুধুমাত্র অ্যাপ ব্যবহার করার সময় অনুমতি দিন
  • এই বিকল্পটি বেশিরভাগ অ্যাপের জন্য প্রস্তাবিত বিকল্প। "ব্যবহারের সময়" বা "শুধুমাত্র ফোরগ্রাউন্ড" অ্যাক্সেস হিসাবেও পরিচিত, এই বিকল্পটি Android 10-এ যোগ করা হয়েছিল এবং অ্যাপটি সক্রিয়ভাবে ব্যবহার করার সময়ই বিকাশকারীদের অবস্থান পুনরুদ্ধার করতে দেয়। নিম্নলিখিতগুলির মধ্যে যেকোনো একটি সত্য হলে একটি অ্যাপ সক্রিয় বলে বিবেচিত হয়:
  • একটি কার্যকলাপ দৃশ্যমান হয়.
  • একটি ফোরগ্রাউন্ড পরিষেবা একটি চলমান বিজ্ঞপ্তি সহ চলছে৷
  • শুধুমাত্র একবার
  • অ্যান্ড্রয়েড 11-এ যোগ করা হয়েছে, এটি শুধুমাত্র অ্যাপ ব্যবহার করার সময় অনুমতি দেওয়ার মতো, কিন্তু সীমিত সময়ের জন্য। আরও তথ্যের জন্য, একবারের অনুমতি দেখুন।
  • অস্বীকার করুন
  • এই বিকল্পটি অবস্থানের তথ্য অ্যাক্সেস করতে বাধা দেয়।
  • সব সময় অনুমতি দিন
  • এই বিকল্পটি সর্বদা অবস্থান অ্যাক্সেসের অনুমতি দেয়, তবে Android 10 এবং উচ্চতর সংস্করণের জন্য একটি অতিরিক্ত অনুমতি প্রয়োজন ৷ আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার একটি বৈধ ব্যবহারের কেস আছে এবং অবস্থান নীতি মেনে চলছেন। আপনি এই কোডল্যাবে এই বিকল্পটি কভার করবেন না, কারণ এটি একটি বিরল ব্যবহারের ক্ষেত্রে। যাইহোক, যদি আপনার কাছে একটি বৈধ ব্যবহারের ক্ষেত্রে থাকে এবং আপনি কীভাবে সঠিকভাবে ব্যাকগ্রাউন্ডে অবস্থান অ্যাক্সেস সহ সর্ব-সময়ের অবস্থান পরিচালনা করতে চান তা বুঝতে চান, LocationUpdatesBackgroundKotlin নমুনাটি পর্যালোচনা করুন।

পরিষেবা, ফোরগ্রাউন্ড পরিষেবা এবং বাঁধাই৷

শুধুমাত্র অ্যাপ্লিকেশান অবস্থান আপডেটগুলি ব্যবহার করার সময় অনুমতি দেওয়াকে সম্পূর্ণরূপে সমর্থন করতে, ব্যবহারকারী কখন আপনার অ্যাপ থেকে দূরে নেভিগেট করবে তার জন্য আপনাকে অ্যাকাউন্ট করতে হবে৷ আপনি যদি সেই পরিস্থিতিতে আপডেটগুলি পাওয়া চালিয়ে যেতে চান, তাহলে আপনাকে একটি অগ্রভাগের Service তৈরি করতে হবে এবং এটিকে একটি Notification সাথে সংযুক্ত করতে হবে৷

উপরন্তু, আপনার অ্যাপটি দৃশ্যমান হলে এবং ব্যবহারকারী যখন আপনার অ্যাপ থেকে দূরে নেভিগেট করে তখন অবস্থান আপডেটের অনুরোধ করতে আপনি একই Service ব্যবহার করতে চাইলে, আপনাকে সেই Service UI উপাদানের সাথে আবদ্ধ/আবদ্ধ করতে হবে।

কারণ এই কোডল্যাবটি শুধুমাত্র অবস্থানের আপডেট পাওয়ার উপর ফোকাস করে, আপনি ForegroundOnlyLocationService.kt ক্লাসে আপনার প্রয়োজনীয় সমস্ত কোড খুঁজে পেতে পারেন। তারা কীভাবে একসাথে কাজ করে তা দেখতে আপনি সেই ক্লাস এবং MainActivity.kt এর মাধ্যমে ব্রাউজ করতে পারেন।

আরও তথ্যের জন্য, পরিষেবার ওভারভিউ এবং আবদ্ধ পরিষেবার ওভারভিউ দেখুন।

অনুমতি

একটি NETWORK_PROVIDER বা GPS_PROVIDER থেকে অবস্থানের আপডেট পেতে, আপনাকে অবশ্যই আপনার Android ম্যানিফেস্ট ফাইলে যথাক্রমে ACCESS_COARSE_LOCATION বা ACCESS_FINE_LOCATION অনুমতি ঘোষণা করে ব্যবহারকারীর অনুমতির জন্য অনুরোধ করতে হবে৷ এই অনুমতিগুলি ছাড়া, আপনার অ্যাপ রানটাইমে অবস্থানে অ্যাক্সেসের অনুরোধ করতে সক্ষম হবে না।

এই অনুমতিগুলি শুধুমাত্র এক সময় কভার করে এবং শুধুমাত্র অ্যাপ ব্যবহার করার সময় অনুমতি দেয় যখন আপনার অ্যাপটি Android 10 বা তার উচ্চতর সংস্করণে চালিত ডিভাইসে ব্যবহার করা হয়।

অবস্থান

আপনার অ্যাপ com.google.android.gms.location প্যাকেজে ক্লাসের মাধ্যমে সমর্থিত অবস্থান পরিষেবার সেট অ্যাক্সেস করতে পারে।

প্রধান ক্লাস দেখুন:

  • FusedLocationProviderClient
  • এটি অবস্থান কাঠামোর কেন্দ্রীয় উপাদান। একবার তৈরি হয়ে গেলে, আপনি অবস্থান আপডেটের অনুরোধ করতে এবং সর্বশেষ পরিচিত অবস্থান পেতে এটি ব্যবহার করেন।
  • LocationRequest
  • এটি একটি ডেটা অবজেক্ট যাতে অনুরোধের জন্য পরিষেবার মান-অবজেক্ট থাকে (আপডেট, অগ্রাধিকার এবং নির্ভুলতার জন্য ব্যবধান)। যখন আপনি অবস্থান আপডেটের অনুরোধ করেন তখন এটি FusedLocationProviderClient এর কাছে পাঠানো হয়।
  • LocationCallback
  • যখন ডিভাইসের অবস্থান পরিবর্তিত হয় বা আর নির্ধারণ করা যায় না তখন এটি বিজ্ঞপ্তি পাওয়ার জন্য ব্যবহৃত হয়। এটি একটি LocationResult পাস করা হয়েছে যেখানে আপনি আপনার ডাটাবেসে সংরক্ষণ করার জন্য Location পেতে পারেন।

এখন আপনি কি করছেন তার একটি প্রাথমিক ধারণা আছে, কোড দিয়ে শুরু করুন!

এই কোডল্যাবটি সর্বাধিক-সাধারণ অবস্থান বিকল্পের উপর ফোকাস করে: অ্যাপটি ব্যবহার করার সময় শুধুমাত্র অনুমতি দিন

অবস্থানের আপডেটগুলি পেতে, আপনার অ্যাপের অবশ্যই একটি দৃশ্যমান কার্যকলাপ থাকতে হবে বা অগ্রভাগে চলমান একটি পরিষেবা থাকতে হবে (একটি বিজ্ঞপ্তি সহ)৷

অনুমতি

এই কোডল্যাবের উদ্দেশ্য হল লোকেশনের আপডেটগুলি কীভাবে গ্রহণ করা যায় তা দেখানো, কীভাবে লোকেশন অনুমতির অনুরোধ করা যায় না, তাই অনুমতি-ভিত্তিক কোডটি ইতিমধ্যেই আপনার জন্য লেখা হয়েছে। আপনি যদি এটি ইতিমধ্যে বুঝতে পারেন তবে নির্দ্বিধায় এটি এড়িয়ে যান।

নিম্নলিখিত অনুমতি হাইলাইট (এই অংশের জন্য কোন কর্মের প্রয়োজন নেই):

  1. আপনি AndroidManifest.xml এ কোন অনুমতি ব্যবহার করছেন তা ঘোষণা করুন।
  2. অবস্থানের তথ্য অ্যাক্সেস করার চেষ্টা করার আগে, ব্যবহারকারী আপনার অ্যাপকে এটি করার অনুমতি দিয়েছেন কিনা তা পরীক্ষা করুন। যদি আপনার অ্যাপ এখনও অনুমতি না পায়, অ্যাক্সেসের অনুরোধ করুন।
  3. ব্যবহারকারীর অনুমতি পছন্দ হ্যান্ডেল. (আপনি এই কোডটি MainActivity.kt এ দেখতে পারেন।)

আপনি যদি TODO: Step 1.0, Review Permissions AndroidManifest.xml বা MainActivity.kt এ অনুমতি পর্যালোচনা করুন, আপনি অনুমতির জন্য লেখা সমস্ত কোড দেখতে পাবেন।

আরও তথ্যের জন্য, অনুমতি ওভারভিউ দেখুন।

এখন, কিছু লোকেশন কোড লেখা শুরু করুন।

অবস্থান আপডেটের জন্য প্রয়োজনীয় মূল ভেরিয়েবল পর্যালোচনা করুন

base মডিউলে, TODO: Step 1.1, Review variables করুন

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 অনুসন্ধান করুন: ধাপ 1.2, ForegroundOnlyLocationService.kt ফাইলে TODO: Step 1.2, Review the FusedLocationProviderClient করুন। আপনার কোড এই মত কিছু দেখতে হবে:

// TODO: Step 1.2, Review the FusedLocationProviderClient.
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

পূর্ববর্তী মন্তব্যে উল্লেখ করা হয়েছে, অবস্থান আপডেট পাওয়ার জন্য এটি প্রধান শ্রেণী। ভেরিয়েবলটি ইতিমধ্যেই আপনার জন্য আরম্ভ করা হয়েছে, তবে এটি কীভাবে শুরু করা হয়েছে তা বোঝার জন্য কোডটি পর্যালোচনা করা গুরুত্বপূর্ণ। অবস্থান আপডেটের অনুরোধ করতে আপনি পরে এখানে কিছু কোড যোগ করুন।

LocationRequest আরম্ভ করুন

  1. base মডিউলে, TODO অনুসন্ধান করুন: ধাপ 1.3, ForegroundOnlyLocationService.kt ফাইলে TODO: Step 1.3, Create a LocationRequest করুন।
  2. মন্তব্যের পরে নিম্নলিখিত কোড যোগ করুন.

LocationRequest ইনিশিয়ালাইজেশন কোড আপনার অনুরোধের জন্য প্রয়োজনীয় পরিষেবার প্যারামিটারের অতিরিক্ত গুণমান যোগ করে (ব্যবধান, সর্বোচ্চ অপেক্ষার সময় এবং অগ্রাধিকার)।

// TODO: Step 1.3, Create a LocationRequest.
locationRequest = LocationRequest().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
}
  1. প্রতিটি কিভাবে কাজ করে তা বুঝতে মন্তব্যের মাধ্যমে পড়ুন।

LocationCallback আরম্ভ করুন

  1. base মডিউলে, TODO: Step 1.4, Initialize the LocationCallback ForegroundOnlyLocationService.kt ফাইলে অবস্থান কলব্যাক শুরু করুন।
  2. মন্তব্যের পরে নিম্নলিখিত কোড যোগ করুন.
// TODO: Step 1.4, Initialize the LocationCallback.
locationCallback = object : LocationCallback() {
   override fun onLocationResult(locationResult: LocationResult?) {
       super.onLocationResult(locationResult)

       if (locationResult?.lastLocation != null) {

           // 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 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))
           }
       } else {
           Log.d(TAG, "Location information isn't available.")
       }
   }
}

আপনি এখানে যে LocationCallback তৈরি করেন সেটি হল একটি নতুন অবস্থান আপডেট উপলব্ধ হলে FusedLocationProviderClient কল করবে।

আপনার কলব্যাকে, আপনি প্রথমে একটি LocationResult অবজেক্ট ব্যবহার করে সর্বশেষ অবস্থান পাবেন। এর পরে, আপনি স্থানীয় সম্প্রচার ব্যবহার করে (যদি এটি সক্রিয় থাকে) ব্যবহার করে আপনার নতুন অবস্থানের Activity অবহিত করেন বা এই পরিষেবাটি অগ্রভাগের Service হিসাবে চলমান থাকলে আপনি Notification আপডেট করেন৷

  1. প্রতিটি অংশ কি করে তা বুঝতে মন্তব্যগুলি পড়ুন।

অবস্থান পরিবর্তন সাবস্ক্রাইব করুন

এখন যেহেতু আপনি সবকিছু শুরু করেছেন, আপনাকে FusedLocationProviderClient জানাতে হবে যে আপনি আপডেট পেতে চান।

  1. base মডিউলে, ধাপ 1.5 অনুসন্ধান করুন, ForegroundOnlyLocationService.kt ফাইলে Step 1.5, Subscribe to location changes
  2. মন্তব্যের পরে নিম্নলিখিত কোড যোগ করুন.
// TODO: Step 1.5, Subscribe to location changes.
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())

requestLocationUpdates requestLocationUpdates() কলটি FusedLocationProviderClient জানতে দেয় যে আপনি অবস্থানের আপডেট পেতে চান।

আপনি সম্ভবত LocationRequest এবং LocationCallback চিনতে পারেন যা আপনি আগে সংজ্ঞায়িত করেছেন। তারা FusedLocationProviderClient কে আপনার অনুরোধের জন্য পরিষেবার মান-পরিমাণ এবং এটির আপডেট হলে কী বলা উচিত তা জানতে দেয়। অবশেষে, Looper অবজেক্ট কলব্যাকের জন্য থ্রেড নির্দিষ্ট করে।

আপনি লক্ষ্য করতে পারেন যে এই কোডটি একটি try/catch বিবৃতির মধ্যে রয়েছে। এই পদ্ধতিতে এই ধরনের একটি ব্লক প্রয়োজন কারণ আপনার অ্যাপের কাছে অবস্থানের তথ্য অ্যাক্সেস করার অনুমতি না থাকলে একটি SecurityException ঘটে।

অবস্থান পরিবর্তন থেকে সদস্যতা ত্যাগ করুন

যখন অ্যাপটির আর অবস্থানের তথ্যে অ্যাক্সেসের প্রয়োজন হয় না, তখন অবস্থানের আপডেটগুলি থেকে সদস্যতা ত্যাগ করা গুরুত্বপূর্ণ৷

  1. base মডিউলে, TODO অনুসন্ধান করুন: ধাপ 1.6, ForegroundOnlyLocationService.kt ফাইলে TODO: Step 1.6, Unsubscribe to location changes ত্যাগ করুন।
  2. মন্তব্যের পরে নিম্নলিখিত কোড যোগ করুন.
// 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 ক্লাসটি দেখুন।

অ্যাপ চালান

অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপ চালান এবং অবস্থান বোতাম চেষ্টা করুন।

আপনি আউটপুট পর্দায় অবস্থান তথ্য দেখতে হবে. এটি Android 9 এর জন্য একটি সম্পূর্ণ কার্যকরী অ্যাপ।

এই বিভাগে, আপনি Android 10 এর জন্য সমর্থন যোগ করুন।

আপনার অ্যাপ্লিকেশান ইতিমধ্যেই অবস্থান পরিবর্তনের সদস্যতা নিয়েছে, তাই খুব বেশি কাজ করতে হবে না৷

প্রকৃতপক্ষে, আপনাকে যা করতে হবে তা হল আপনার ফোরগ্রাউন্ড পরিষেবাটি অবস্থানের উদ্দেশ্যে ব্যবহার করা হয় তা উল্লেখ করা।

টার্গেট SDK 29

  1. base মডিউলে, TODO: Step 2.1, Target SDK 10 build.gradle ফাইলে টার্গেট SDK 10।
  2. এই পরিবর্তনগুলি করুন:
  1. compileSdkVersion 29 এ সেট করুন।
  2. "29.0.3" buildToolsVersion করুন।
  3. targetSdkVersion 29 এ সেট করুন।

আপনার কোড এই মত কিছু দেখতে হবে:

android {
   // TODO: Step 2.1, Target Android 10.
   compileSdkVersion 29
   buildToolsVersion "29.0.3"
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion 29
       versionCode 1
       versionName "1.0"
   }
...
}

আপনি এটি করার পরে, আপনাকে আপনার প্রকল্প সিঙ্ক করতে বলা হবে। এখন সিঙ্ক এ ক্লিক করুন।

এর পরে, আপনার অ্যাপ Android 10 এর জন্য প্রায় প্রস্তুত।

ফোরগ্রাউন্ড পরিষেবার ধরন যোগ করুন

অ্যান্ড্রয়েড 10-এ, ব্যবহারের সময় অবস্থান অ্যাক্সেসের প্রয়োজন হলে আপনাকে আপনার ফোরগ্রাউন্ড পরিষেবার ধরন অন্তর্ভুক্ত করতে হবে। আপনার ক্ষেত্রে, এটি অবস্থানের তথ্য পেতে ব্যবহার করা হচ্ছে।

base মডিউলে, TODO: 2.2, Add foreground service type 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>

এটাই! আপনার অ্যাপ Android-এ অবস্থানের জন্য সর্বোত্তম অনুশীলনগুলি অনুসরণ করে "ব্যবহারের সময়" জন্য Android 10 অবস্থান সমর্থন করে৷

অ্যাপ চালান

অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপ চালান এবং অবস্থান বোতাম চেষ্টা করুন।

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

এই বিভাগে, আপনি Android 11 টার্গেট করেছেন।

দারুণ খবর, আপনাকে build.gradle ফাইল ছাড়া অন্য কোনো ফাইলে পরিবর্তন করতে হবে না!

লক্ষ্য SDK আর

  1. base মডিউলে, TODO: Step 2.1, Target SDK build.gradle ফাইলে।
  2. এই পরিবর্তনগুলি করুন:
  1. "android-R" compileSdkVersion
  2. targetSdkVersion থেকে "R"

আপনার কোড এই মত কিছু দেখতে হবে:

android {
   // TODO: Step 2.1, Target Android 10.
   compileSdkVersion "android-R"
   buildToolsVersion "29.0.2"
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion "R"
       versionCode 1
       versionName "1.0"
   }
...
}

আপনি এটি করার পরে, আপনাকে আপনার প্রকল্প সিঙ্ক করতে বলা হবে। এখন সিঙ্ক এ ক্লিক করুন।

এর পরে, আপনার অ্যাপ Android 11 এর জন্য প্রস্তুত!

অ্যাপ চালান

অ্যান্ড্রয়েড স্টুডিও থেকে আপনার অ্যাপ চালান এবং বোতামে ক্লিক করার চেষ্টা করুন।

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

এই কোডল্যাবে দেখানো উপায়ে অবস্থানের অনুমতিগুলি পরীক্ষা করে এবং অনুরোধ করার মাধ্যমে, আপনার অ্যাপটি ডিভাইসের অবস্থান সম্পর্কিত তার অ্যাক্সেস লেভেলের ট্র্যাক করতে পারে।

এই পৃষ্ঠাটি অবস্থানের অনুমতি সম্পর্কিত কয়েকটি মূল সেরা অনুশীলনের তালিকা দেয়। আপনার ব্যবহারকারীদের ডেটা কীভাবে সুরক্ষিত রাখবেন সে সম্পর্কে আরও তথ্যের জন্য, অ্যাপের অনুমতির সেরা অনুশীলনগুলি দেখুন৷

শুধুমাত্র আপনার প্রয়োজনীয় অনুমতিগুলির জন্য জিজ্ঞাসা করুন

প্রয়োজন হলেই অনুমতি চাও। উদাহরণ স্বরূপ:

  • একেবারে প্রয়োজনীয় না হলে অ্যাপ স্টার্টআপে অবস্থানের অনুমতির অনুরোধ করবেন না।
  • যদি আপনার অ্যাপটি Android 10 বা তার পরবর্তী সংস্করণগুলিকে লক্ষ্য করে এবং আপনার কাছে একটি ফোরগ্রাউন্ড পরিষেবা থাকে, তাহলে ম্যানিফেস্টে "location" একটি foregroundServiceType ঘোষণা করুন৷
  • ব্যাকগ্রাউন্ড অবস্থানের অনুমতির জন্য অনুরোধ করবেন না যদি না আপনার কাছে ব্যবহারকারীর অবস্থানে নিরাপদ এবং আরও স্বচ্ছ অ্যাক্সেসে বর্ণিত একটি বৈধ ব্যবহারের ক্ষেত্রে থাকে৷

অনুমতি না দেওয়া হলে করুণাময় অবক্ষয় সমর্থন করুন

একটি ভাল ব্যবহারকারীর অভিজ্ঞতা বজায় রাখতে, আপনার অ্যাপটি এমনভাবে ডিজাইন করুন যাতে এটি নিম্নোক্ত পরিস্থিতিগুলি সুন্দরভাবে পরিচালনা করতে পারে:

  • আপনার অ্যাপের অবস্থানের তথ্যে কোনো অ্যাক্সেস নেই।
  • ব্যাকগ্রাউন্ডে চলার সময় আপনার অ্যাপের অবস্থানের তথ্যে অ্যাক্সেস থাকে না।

আপনি শিখেছেন কীভাবে Android-এ লোকেশন আপডেট পেতে হয়, সেরা অনুশীলনগুলি মাথায় রেখে!

আরও জানুন