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

जगह की जानकारी का सही इस्तेमाल आपके ऐप्लिकेशन के उपयोगकर्ताओं के लिए फ़ायदेमंद हो सकता है. उदाहरण के लिए, अगर आपका ऐप्लिकेशन पैदल चलते या गाड़ी चलाते समय उपयोगकर्ता को अपना रास्ता ढूंढने में मदद करता है या अगर आपका ऐप्लिकेशन, ऐसेट की जगह की जानकारी ट्रैक करता है, तो उसे समय-समय पर डिवाइस की जगह की जानकारी मिलनी चाहिए. जगह की जानकारी (अक्षांश और देशांतर) के साथ-साथ, उपयोगकर्ता को और भी जानकारी दी जा सकती है. जैसे, डिवाइस की दिशा (यात्रा की हॉरिज़ॉन्टल दिशा), ऊंचाई या गति. यह जानकारी के साथ-साथ अन्य जानकारी 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 गतिविधि क्लास का रेफ़रंस देखें.

ध्यान दें: उपयोगकर्ता की प्राथमिकताओं को ज़्यादा समय तक सेव रखने के लिए, अपने ऐप्लिकेशन के SharedPreferences में सेव किया जा सकता है. अपनी गतिविधि के onPause() तरीके में, शेयर की गई सेटिंग सेट करें और onResume() में सेटिंग को वापस पाएं. प्राथमिकताओं को सेव करने के बारे में ज़्यादा जानकारी के लिए, मुख्य वैल्यू के सेट सेव करना पढ़ें.

अन्य संसाधन

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

सैंपल