অবস্থান আপডেট অনুরোধ

অবস্থান তথ্যের যথাযথ ব্যবহার আপনার অ্যাপ ব্যবহারকারীদের জন্য উপকারী হতে পারে। উদাহরণস্বরূপ, যদি আপনার অ্যাপ ব্যবহারকারীকে হাঁটা বা গাড়ি চালানোর সময় তাদের পথ খুঁজে পেতে সাহায্য করে, অথবা যদি আপনার অ্যাপ সম্পদের অবস্থান ট্র্যাক করে, তাহলে নিয়মিত বিরতিতে ডিভাইসের অবস্থান জানতে হবে। ভৌগোলিক অবস্থান (অক্ষাংশ এবং দ্রাঘিমাংশ) এর পাশাপাশি, আপনি ব্যবহারকারীকে ডিভাইসের বিয়ারিং (ভ্রমণের অনুভূমিক দিক), উচ্চতা বা বেগের মতো আরও তথ্য দিতে চাইতে পারেন। এই তথ্য এবং আরও অনেক কিছু, Location বস্তুতে পাওয়া যায় যা আপনার অ্যাপটি সংযুক্ত অবস্থান প্রদানকারী থেকে পুনরুদ্ধার করতে পারে। প্রতিক্রিয়া হিসাবে, API আপনার অ্যাপটিকে পর্যায়ক্রমে সেরা উপলব্ধ অবস্থানের সাথে আপডেট করে, যা বর্তমানে উপলব্ধ অবস্থান প্রদানকারী যেমন WiFi এবং GPS (গ্লোবাল পজিশনিং সিস্টেম) এর উপর ভিত্তি করে। অবস্থানের নির্ভুলতা প্রদানকারী, আপনার অনুরোধ করা অবস্থান অনুমতি এবং অবস্থান অনুরোধে আপনি যে বিকল্পগুলি সেট করেছেন তার দ্বারা নির্ধারিত হয়।

এই পাঠে আপনাকে দেখানো হবে কিভাবে ফিউজড লোকেশন প্রোভাইডারে requestLocationUpdates() পদ্ধতি ব্যবহার করে ডিভাইসের অবস্থান সম্পর্কে নিয়মিত আপডেটের অনুরোধ করতে হয়।

শেষ পরিচিত অবস্থানটি পান

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

একটি অবস্থানের অনুরোধ করুন

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

অনুরোধের ধরণ অনুসারে, ফিউজড লোকেশন প্রোভাইডার হয় LocationCallback.onLocationResult() কলব্যাক পদ্ধতিটি ব্যবহার করে এবং এটিকে Location অবজেক্টের একটি তালিকা প্রদান করে, অথবা একটি PendingIntent ইস্যু করে যার বর্ধিত ডেটাতে লোকেশন থাকে। আপডেটের নির্ভুলতা এবং ফ্রিকোয়েন্সি আপনার অনুরোধ করা লোকেশন অনুমতি এবং লোকেশন রিকোয়েস্ট অবজেক্টে আপনি যে বিকল্পগুলি সেট করেছেন তার দ্বারা প্রভাবিত হয়।

এই পাঠে আপনি LocationCallback কলব্যাক পদ্ধতি ব্যবহার করে আপডেটটি কীভাবে পাবেন তা শিখবেন। requestLocationUpdates() কল করুন, LocationRequest অবজেক্টের আপনার ইনস্ট্যান্সটি পাস করুন এবং একটি LocationCallback । নিম্নলিখিত কোড নমুনায় দেখানো startLocationUpdates() পদ্ধতিটি সংজ্ঞায়িত করুন:

কোটলিন

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

জাভা

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

লক্ষ্য করুন যে উপরের কোড স্নিপেটটি একটি বুলিয়ান ফ্ল্যাগ, requestingLocationUpdates কথা উল্লেখ করে, যা ব্যবহারকারী লোকেশন আপডেট চালু করেছেন কিনা তা ট্র্যাক করতে ব্যবহৃত হয়। যদি ব্যবহারকারীরা লোকেশন আপডেট বন্ধ করে থাকেন, তাহলে আপনি তাদের আপনার অ্যাপের লোকেশনের প্রয়োজনীয়তা সম্পর্কে জানাতে পারেন। অ্যাক্টিভিটির বিভিন্ন ক্ষেত্রে বুলিয়ান ফ্ল্যাগের মান ধরে রাখার বিষয়ে আরও জানতে, Save the State of the Activity দেখুন।

অবস্থান আপডেট কলব্যাক নির্ধারণ করুন

ফিউজড লোকেশন প্রোভাইডার LocationCallback.onLocationResult() কলব্যাক পদ্ধতি ব্যবহার করে। ইনকামিং আর্গুমেন্টে লোকেশনের অক্ষাংশ এবং দ্রাঘিমাংশ সম্বলিত একটি তালিকা Location অবজেক্ট থাকে। নিম্নলিখিত স্নিপেটে LocationCallback ইন্টারফেস কীভাবে বাস্তবায়ন করতে হয় এবং পদ্ধতিটি কীভাবে সংজ্ঞায়িত করতে হয় তা দেখানো হয়েছে, তারপর লোকেশন আপডেটের টাইমস্ট্যাম্প পেতে হবে এবং আপনার অ্যাপের ইউজার ইন্টারফেসে অক্ষাংশ, দ্রাঘিমাংশ এবং টাইমস্ট্যাম্প প্রদর্শন করতে হবে:

কোটলিন

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

জাভা

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

অবস্থান আপডেট বন্ধ করুন

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

লোকেশন আপডেট বন্ধ করতে, removeLocationUpdates() কল করুন, এটিকে LocationCallback পাস করুন, যেমনটি নিম্নলিখিত কোড নমুনায় দেখানো হয়েছে:

কোটলিন

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

জাভা

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

অবস্থান আপডেট বর্তমানে চালু আছে কিনা তা ট্র্যাক করতে একটি বুলিয়ান, requestingLocationUpdates ব্যবহার করুন। কার্যকলাপের onResume() পদ্ধতিতে, অবস্থান আপডেট বর্তমানে সক্রিয় আছে কিনা তা পরীক্ষা করুন এবং যদি না থাকে তবে সেগুলি সক্রিয় করুন:

কোটলিন

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

জাভা

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

কার্যকলাপের অবস্থা সংরক্ষণ করুন

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

নিচের কোড নমুনাটি দেখায় কিভাবে অ্যাক্টিভিটির onSaveInstanceState() কলব্যাক ব্যবহার করে ইনস্ট্যান্স স্টেটটি সংরক্ষণ করতে হয়:

কোটলিন

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

জাভা

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

পূর্ববর্তী অ্যাক্টিভিটির ইনস্ট্যান্স থেকে সংরক্ষিত মানগুলি পুনরুদ্ধার করার জন্য একটি updateValuesFromBundle() পদ্ধতি নির্ধারণ করুন, যদি সেগুলি উপলব্ধ থাকে। নিম্নলিখিত কোড নমুনায় দেখানো হিসাবে অ্যাক্টিভিটির onCreate() পদ্ধতি থেকে পদ্ধতিটি কল করুন:

কোটলিন

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

জাভা

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

ইনস্ট্যান্স স্টেট সংরক্ষণ সম্পর্কে আরও জানতে, Android Activity ক্লাস রেফারেন্স দেখুন।

দ্রষ্টব্য: আরও স্থায়ী স্টোরেজের জন্য, আপনি আপনার অ্যাপের SharedPreferences এ ব্যবহারকারীর পছন্দগুলি সংরক্ষণ করতে পারেন। আপনার কার্যকলাপের onPause() পদ্ধতিতে ভাগ করা পছন্দ সেট করুন এবং onResume() এ পছন্দটি পুনরুদ্ধার করুন। পছন্দগুলি সংরক্ষণ সম্পর্কে আরও তথ্যের জন্য, Saving Key-Value Sets পড়ুন।

অতিরিক্ত সম্পদ

আরও জানতে, নিম্নলিখিত সংস্থানগুলির সুবিধা নিন:

নমুনা