লোকেশন আপডেট করার অনুরোধ করুন

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

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

সর্বশেষ যে লোকেশন জানা গেছে তা পান

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

লোকেশন শেয়ার করার অনুরোধ করা

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

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

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

Kotlin

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 ইন্টারফেস প্রয়োগ করতে হয় এবং পদ্ধতিটি সংজ্ঞায়িত করতে হয়, তারপর লোকেশন আপডেটের টাইমস্ট্যাম্প পেতে হয় এবং আপনার অ্যাপের ইউজার ইন্টারফেসে অক্ষাংশ, দ্রাঘিমাংশ এবং টাইমস্ট্যাম্প দেখাতে হয়:

Kotlin

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 পাস করুন, যেমনটি নিম্নলিখিত কোড স্যাম্পেলে দেখানো হয়েছে:

Kotlin

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() পদ্ধতিতে, লোকেশন আপডেট বর্তমানে অ্যাক্টিভ আছে কিনা চেক করুন এবং না থাকলে অ্যাক্টিভেট করুন:

Kotlin

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

জাভা

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

অ্যাক্টিভিটির অবস্থা সেভ করুন

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

নিম্নলিখিত কোড স্যাম্পেল থেকে জানতে পারবেন যে কীভাবে ইনস্ট্যান্স স্টেট সেভ করার জন্য অ্যাক্টিভিটির onSaveInstanceState() কলব্যাক ব্যবহার করতে হয়:

Kotlin

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() মেথড থেকে মেথডটি কল করুন, যেমনটি নিম্নলিখিত কোড স্যাম্পেলে দেখানো হয়েছে:

Kotlin

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 অ্যাক্টিভিটি ক্লাস রেফারেন্স দেখুন।

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

অতিরিক্ত রিসোর্স

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

নমুনা