जगह की जानकारी के अपडेट का अनुरोध करें

जगह की जानकारी का सही तरीके से इस्तेमाल करने पर, आपके ऐप्लिकेशन के उपयोगकर्ताओं को फ़ायदा मिल सकता है. उदाहरण के लिए, अगर आपका ऐप्लिकेशन पैदल चलने या ड्राइविंग के दौरान, उपयोगकर्ता को रास्ता ढूंढने में मदद करता है या अगर आपका ऐप्लिकेशन ऐसेट की जगह की जानकारी ट्रैक करता है, तो उसे नियमित अंतराल पर डिवाइस की जगह की जानकारी पाने की ज़रूरत होती है. भौगोलिक जगह (अक्षांश और देशांतर) के साथ-साथ, आपको उपयोगकर्ता को और जानकारी भी देनी पड़ सकती है. जैसे, डिवाइस की दिशा (यात्रा की हॉरिज़ॉन्टल दिशा), ऊंचाई या गति. यह जानकारी और अन्य जानकारी, Location ऑब्जेक्ट में उपलब्ध होती है. आपका ऐप्लिकेशन, कई तरह से जांची गई सही जगह की जानकारी देने वाले एपीआई से इसे वापस पा सकता है. इसके जवाब में, एपीआई आपके ऐप्लिकेशन को समय-समय पर सबसे सटीक जगह की जानकारी देता है. यह जानकारी, वाई-फ़ाई और जीपीएस (ग्लोबल पोज़िशनिंग सिस्टम) जैसे, जगह की जानकारी देने वाले मौजूदा सोर्स के आधार पर मिलती है. जगह की सटीक जानकारी, इन चीज़ों के आधार पर तय की जाती है: जगह की जानकारी देने वाले एपीआई, जगह की जानकारी ऐक्सेस करने की अनुमति के लिए किया गया अनुरोध, और जगह की जानकारी के अनुरोध में सेट किए गए विकल्प.

इस सबक में, फ़्यूज़्ड लोकेशन प्रोवाइडर में 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())
}

Java

@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
                // ...
            }
        }
    }
}

Java

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)
}

Java

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

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

बूलियन requestingLocationUpdates का इस्तेमाल करके यह ट्रैक करें कि जगह की जानकारी अपडेट करने की सुविधा चालू है या नहीं. गतिविधि के onResume() तरीके में, देखें कि जगह की जानकारी के अपडेट चालू हैं या नहीं. अगर चालू नहीं हैं, तो उन्हें चालू करें:

Kotlin

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

Java

@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)
}

Java

@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()
}

Java

@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() में सेटिंग वापस पाएं. प्राथमिकताएं सेव करने के बारे में ज़्यादा जानने के लिए, कुंजी-वैल्यू सेट सेव करना लेख पढ़ें.

अन्य संसाधन

ज़्यादा जानने के लिए, यहां दिए गए संसाधनों का इस्तेमाल करें:

सैंपल