जगह की जानकारी की सेटिंग बदलना

अगर आपके ऐप्लिकेशन को जगह की जानकारी का अनुरोध करना है या अनुमति से जुड़े अपडेट पाने हैं, तो डिवाइस पर सिस्टम की सही सेटिंग चालू करनी होंगी. जैसे, जीपीएस या वाई-फ़ाई स्कैनिंग. डिवाइस के जीपीएस जैसी सेवाओं को सीधे तौर पर चालू करने के बजाय, आपका ऐप्लिकेशन यह तय करता है कि जगह की जानकारी कितनी सटीक होनी चाहिए, बैटरी की खपत कितनी होनी चाहिए, और अपडेट का इंटरवल कितना होना चाहिए. इसके बाद, डिवाइस अपने-आप सिस्टम की सेटिंग में ज़रूरी बदलाव करता है. ये सेटिंग, LocationRequest डेटा ऑब्जेक्ट से तय होती हैं.

इस लेसन में, Settings Client का इस्तेमाल करने का तरीका बताया गया है. इससे यह पता चलता है कि कौनसी सेटिंग चालू हैं. साथ ही, उपयोगकर्ता को जगह की जानकारी की सेटिंग का डायलॉग बॉक्स दिखता है, ताकि वह एक टैप से अपनी सेटिंग अपडेट कर सके.

जगह की जानकारी का डेटा इस्तेमाल करने वाली सेवाओं को कॉन्फ़िगर करना

Google Play Services और कई तरह से जांची गई सही जगह की जानकारी देने वाले एपीआई की मदद से, जगह की जानकारी का डेटा इस्तेमाल करने वाली सेवाओं का इस्तेमाल करने के लिए, Settings Client का इस्तेमाल करके अपने ऐप्लिकेशन को कनेक्ट करें. इसके बाद, जगह की जानकारी की मौजूदा सेटिंग देखें और ज़रूरत पड़ने पर, उपयोगकर्ता को ज़रूरी सेटिंग चालू करने के लिए कहें.

जिन ऐप्लिकेशन की सुविधाओं के लिए, जगह की जानकारी का डेटा इस्तेमाल करने वाली सेवाओं की ज़रूरत होती है उन्हें जगह की जानकारी की अनुमति का अनुरोध करना चाहिए. यह अनुरोध, उन सुविधाओं के इस्तेमाल के उदाहरणों के आधार पर किया जाना चाहिए.

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

कई तरह से जांची गई सही जगह की जानकारी देने वाले एपीआई को किए जाने वाले अनुरोधों के पैरामीटर सेव करने के लिए, LocationRequest बनाएं. पैरामीटर से यह तय होता है कि जगह की जानकारी के अनुरोध कितने सटीक हैं. जगह की जानकारी के अनुरोध के लिए उपलब्ध सभी विकल्पों के बारे में जानने के लिए, LocationRequest क्लास रेफ़रंस देखें. इस लेसन में, अपडेट इंटरवल, सबसे तेज़ अपडेट इंटरवल, और प्राथमिकता को सेट किया गया है. इनके बारे में यहां बताया गया है:

अपडेट का इंटरवल
setIntervalMillis() - इस तरीके से, मिलीसेकंड में वह दर सेट की जाती है जिस पर आपके ऐप्लिकेशन को डिवाइस की जगह की जानकारी का अपडेट पाने होते हैं. ध्यान दें कि बैटरी के इस्तेमाल को ऑप्टिमाइज़ करने के लिए, डिवाइस की जगह की जानकारी के अपडेट इस दर से कुछ तेज़ या धीमे हो सकते हैं. इसके अलावा, ऐसा भी हो सकता है कि कोई अपडेट न मिले. उदाहरण के लिए, अगर डिवाइस में कनेक्टिविटी नहीं है.
अपडेट होने का सबसे तेज़ इंटरवल
setMinUpdateIntervalMillis() - इस तरीके से, मिलीसेकंड में सबसे तेज़ दर सेट की जाती है. इस दर पर, आपका ऐप्लिकेशन डिवाइस की जगह की जानकारी के अपडेट को मैनेज कर सकता है. अगर आपके ऐप्लिकेशन को setInterval() में बताई गई दर से ज़्यादा तेज़ी से अपडेट पाने से फ़ायदा नहीं होता है, तो आपको इस तरीके को कॉल करने की ज़रूरत नहीं है.
प्राथमिकता

setPriority() - यह तरीका, अनुरोध की प्राथमिकता सेट करता है. इससे Google Play services की जगह की जानकारी की सेवाओं को इस बारे में अहम जानकारी मिलती है कि जगह की जानकारी के किन सोर्स का इस्तेमाल करना है. इन वैल्यू का इस्तेमाल किया जा सकता है:

  • PRIORITY_BALANCED_POWER_ACCURACY - इस सेटिंग का इस्तेमाल करके, जगह की सटीक जानकारी का अनुरोध करें. इससे आपको शहर के किसी ब्लॉक के अंदर की जानकारी मिलेगी. यह जानकारी करीब 100 मीटर तक सटीक होती है. इसे जगह की जानकारी का अनुमानित लेवल माना जाता है. इसमें बैटरी कम खर्च होने की संभावना होती है. इस सेटिंग की मदद से, जगह की जानकारी का डेटा इस्तेमाल करने वाली सेवाएं, वाई-फ़ाई और सेल टावर की पोज़िशनिंग का इस्तेमाल कर सकती हैं. हालांकि, ध्यान दें कि जगह की जानकारी देने वाली सेवा का चुनाव कई अन्य बातों पर निर्भर करता है. जैसे, कौनसे सोर्स उपलब्ध हैं.
  • PRIORITY_HIGH_ACCURACY - इस सेटिंग का इस्तेमाल करके, जगह की सटीक जानकारी का अनुरोध करें. इस सेटिंग के चालू होने पर, जगह की जानकारी का डेटा इस्तेमाल करने वाली सेवाएं, जगह की जानकारी का पता लगाने के लिए जीपीएस का इस्तेमाल कर सकती हैं.
  • PRIORITY_LOW_POWER - इस सेटिंग का इस्तेमाल करके, शहर के लेवल पर सटीक जानकारी का अनुरोध करें. यह जानकारी, करीब 10 किलोमीटर के दायरे में सटीक होती है. इसे सटीक जानकारी का सामान्य लेवल माना जाता है. इसमें कम बैटरी खर्च होने की संभावना होती है.
  • PRIORITY_PASSIVE - इस सेटिंग का इस्तेमाल तब करें, जब आपको बैटरी की खपत कम करनी हो, लेकिन डिवाइस की जगह की जानकारी का अपडेट उपलब्ध होने पर उसे पाना हो. इस सेटिंग की मदद से, आपका ऐप्लिकेशन जगह की जानकारी का कोई अपडेट ट्रिगर नहीं करता. हालांकि, उसे अन्य ऐप्लिकेशन से ट्रिगर की गई जगह की जानकारी मिलती है.

जगह की जानकारी का अनुरोध बनाएं और पैरामीटर सेट करें, जैसा कि इस कोड सैंपल में दिखाया गया है:

Kotlin

  fun createLocationRequest() {
    val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
        .setMinUpdateIntervalMillis(5000)
        .build()
}

Java

  protected void createLocationRequest() {
    LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
            .setMinUpdateIntervalMillis(5000)
            .build();
}

PRIORITY_HIGH_ACCURACY की प्राथमिकता, ऐप्लिकेशन मेनिफ़ेस्ट में तय की गई ACCESS_FINE_LOCATION अनुमति की सेटिंग, और 5,000 मिलीसेकंड (पांच सेकंड) के अपडेट इंटरवल की वजह से, कई तरह से जांची गई सही जगह की जानकारी देने वाले एपीआई को जगह की जानकारी के अपडेट मिलते हैं. ये अपडेट कुछ फ़ीट तक सटीक होते हैं. यह तरीका, रीयल टाइम में जगह की जानकारी दिखाने वाले मैपिंग ऐप्लिकेशन के लिए सही है.

परफ़ॉर्मेंस से जुड़ी सलाह: अगर आपका ऐप्लिकेशन, डिवाइस की जगह की जानकारी का अपडेट मिलने के बाद, नेटवर्क को ऐक्सेस करता है या लंबे समय तक चलने वाला कोई दूसरा काम करता है, तो सबसे तेज़ इंटरवल को कम वैल्यू पर सेट करें. इस बदलाव से, आपके ऐप्लिकेशन को ऐसे अपडेट नहीं मिलते जिनका वह इस्तेमाल नहीं कर सकता. ज़्यादा समय तक चलने वाला काम पूरा होने के बाद, सबसे तेज़ इंटरवल को फिर से तेज़ वैल्यू पर सेट करें.

जगह की जानकारी की मौजूदा सेटिंग देखना

Google Play services और जगह की जानकारी की सेवाओं के एपीआई से कनेक्ट करने के बाद, उपयोगकर्ता के डिवाइस की मौजूदा जगह की जानकारी की सेटिंग देखी जा सकती हैं. ऐसा करने के लिए, एक LocationSettingsRequest.Builder बनाएं और जगह की जानकारी के लिए एक या उससे ज़्यादा अनुरोध जोड़ें. नीचे दिए गए कोड स्निपेट में, पिछले चरण में बनाए गए जगह की जानकारी के अनुरोध को जोड़ने का तरीका बताया गया है:

Kotlin

val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(locationRequest);

इसके बाद, देखें कि जगह की जानकारी की मौजूदा सेटिंग के मुताबिक, ये शर्तें पूरी हो रही हैं या नहीं:

Kotlin

val builder = LocationSettingsRequest.Builder()

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

// ...

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

Task पूरा होने पर, आपका ऐप्लिकेशन LocationSettingsResponse ऑब्जेक्ट से स्टेटस कोड देखकर, जगह की जानकारी की सेटिंग की जांच कर सकता है. जगह की जानकारी की सेटिंग की मौजूदा स्थिति के बारे में ज़्यादा जानकारी पाने के लिए, आपका ऐप्लिकेशन LocationSettingsResponse ऑब्जेक्ट के getLocationSettingsStates() तरीके को कॉल कर सकता है.

उपयोगकर्ता को जगह की जानकारी की सेटिंग बदलने के लिए कहें

जगह की जानकारी के अनुरोध के लिए, जगह की जानकारी की सेटिंग सही हैं या नहीं, यह पता लगाने के लिए OnFailureListener को Task ऑब्जेक्ट में जोड़ें. इससे जगह की जानकारी की सेटिंग की पुष्टि होती है. इसके बाद, देखें कि onFailure() मेथड को पास किया गया Exception ऑब्जेक्ट, ResolvableApiException क्लास का इंस्टेंस है या नहीं. अगर ऐसा है, तो इसका मतलब है कि सेटिंग में बदलाव करना ज़रूरी है. इसके बाद, एक डायलॉग बॉक्स दिखाएं. इसमें उपयोगकर्ता से जगह की जानकारी की सेटिंग में बदलाव करने की अनुमति मांगी जाती है. इसके लिए, startResolutionForResult() को कॉल करें.

यहां दिए गए कोड स्निपेट से पता चलता है कि उपयोगकर्ता की जगह की जानकारी की सेटिंग, जगह की जानकारी का डेटा इस्तेमाल करने वाली सेवाओं को LocationRequest बनाने की अनुमति देती हैं या नहीं. साथ ही, इससे यह भी पता चलता है कि ज़रूरत पड़ने पर, उपयोगकर्ता से जगह की जानकारी की सेटिंग बदलने की अनुमति कैसे मांगी जाए:

Kotlin

task.addOnSuccessListener { locationSettingsResponse ->
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}

task.addOnFailureListener { exception ->
    if (exception is ResolvableApiException){
        // Location settings are not satisfied, but this can be fixed
        // by showing the user a dialog.
        try {
            // Show the dialog by calling startResolutionForResult(),
            // and check the result in onActivityResult().
            exception.startResolutionForResult(this@MainActivity,
                    REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
            // Ignore the error.
        }
    }
}

Java

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

अगले लेसन, जगह की जानकारी के अपडेट का अनुरोध करना में, आपको समय-समय पर जगह की जानकारी के अपडेट पाने का तरीका बताया गया है.