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

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

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

यह तय करने के लिए कि जगह की जानकारी के अनुरोध के लिए, जगह की जानकारी की सेटिंग सही हैं या नहीं, Task ऑब्जेक्ट में OnFailureListener जोड़ें. इससे जगह की जानकारी की सेटिंग की पुष्टि होती है. इसके बाद, यह देखें कि 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.
            }
        }
    }
});

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