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

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

এই পাঠে দেখানো হয়েছে কিভাবে ফিউজড লোকেশন প্রোভাইডারে 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 নামক একটি বুলিয়ান ফ্ল্যাগকে নির্দেশ করে, যা ব্যবহারকারী লোকেশন আপডেট চালু বা বন্ধ করেছেন কিনা তা ট্র্যাক করতে ব্যবহৃত হয়। যদি ব্যবহারকারীরা লোকেশন আপডেট বন্ধ করে রাখেন, তবে আপনি তাদেরকে আপনার অ্যাপের লোকেশনের প্রয়োজনীয়তা সম্পর্কে জানাতে পারেন। অ্যাক্টিভিটির বিভিন্ন ইনস্ট্যান্সে বুলিয়ান ফ্ল্যাগের মান ধরে রাখার বিষয়ে আরও জানতে, "অ্যাক্টিভিটির স্টেট সংরক্ষণ করুন" দেখুন।

অবস্থান আপডেট কলব্যাক সংজ্ঞায়িত করুন

ফিউজড লোকেশন প্রোভাইডারটি 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() মেথডে আপডেটগুলো বন্ধ করতে পারেন।

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

কোটলিন

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 ) অবজেক্টে সংরক্ষিত ইনস্ট্যান্স স্টেট (instance state) ব্যবহার করা।

নিম্নলিখিত কোড নমুনাটি দেখায় কিভাবে অ্যাক্টিভিটির 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();
}

ইনস্ট্যান্স স্টেট সংরক্ষণ সম্পর্কে আরও জানতে অ্যান্ড্রয়েড অ্যাক্টিভিটি ক্লাস রেফারেন্স দেখুন।

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

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

আরও জানতে, নিম্নলিখিত উৎসগুলো ব্যবহার করুন:

নমুনা