जियोफ़ेंस बनाएं और उसे मॉनिटर करें

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

आपके पास एक से ज़्यादा चालू जियोफ़ेंस हो सकते हैं. हालांकि, हर डिवाइस के उपयोगकर्ता के लिए, हर ऐप्लिकेशन में 100 से ज़्यादा जियोफ़ेंस नहीं हो सकते. हर जियोफ़ेंस के लिए, Location Services से आपको एंट्रेंस और एक्ज़िट इवेंट भेजने के लिए कहा जा सकता है. इसके अलावा, किसी इवेंट को ट्रिगर करने से पहले, जियोफ़ेंस के अंदर इंतज़ार करने या रहने के लिए, समय भी तय किया जा सकता है. किसी भी जियोफ़ेंस की समयसीमा तय की जा सकती है. इसके लिए, खत्म होने की अवधि को मिलीसेकंड में बताना होगा. जियोफ़ेंस की समयसीमा खत्म होने पर, जगह की जानकारी देने वाली सेवा इसे अपने-आप हटा देती है.

इस लेख में, जियोफ़ेंस जोड़ने और हटाने का तरीका बताया गया है. साथ ही, BroadcastReceiver का इस्तेमाल करके, जियोफ़ेंस ट्रांज़िशन को सुनने का तरीका भी बताया गया है.

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

जियोफ़ेंस की निगरानी के लिए सेट अप करना

जियोफ़ेंस की निगरानी का अनुरोध करने के लिए, सबसे पहले ज़रूरी अनुमतियों का अनुरोध करना होगा. जियोफ़ेंसिंग का इस्तेमाल करने के लिए, आपके ऐप्लिकेशन को इन चीज़ों का अनुरोध करना होगा:

  • ACCESS_FINE_LOCATION
  • ACCESS_BACKGROUND_LOCATION अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) या उसके बाद के वर्शन को टारगेट करता है

ज़्यादा जानने के लिए, जगह की जानकारी की अनुमतियों के लिए अनुरोध करने का तरीका बताने वाली गाइड देखें.

अगर आपको जियोफ़ेंस ट्रांज़िशन को सुनने के लिए BroadcastReceiver का इस्तेमाल करना है, तो सेवा के नाम की जानकारी देने वाला एलिमेंट जोड़ें. यह एलिमेंट, <application> एलिमेंट का चाइल्ड होना चाहिए:

<application
   android:allowBackup="true">
   ...
   <receiver android:name=".GeofenceBroadcastReceiver"/>
<application/>

जगह की जानकारी के एपीआई ऐक्सेस करने के लिए, आपको ज़्योफ़ेंसिंग क्लाइंट का एक इंस्टेंस बनाना होगा. अपने क्लाइंट को कनेक्ट करने का तरीका जानने के लिए:

Kotlin

lateinit var geofencingClient: GeofencingClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this)
}

Java

private GeofencingClient geofencingClient;

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this);
}

जियोफ़ेंस बनाएं और जोड़ें

आपके ऐप्लिकेशन को जियोफ़ेंस ऑब्जेक्ट बनाने के लिए, लोकेशन एपीआई के बिल्डर क्लास का इस्तेमाल करके जियोफ़ेंस बनाने और जोड़ने होंगे. साथ ही, उन्हें जोड़ने के लिए सुविधा क्लास की ज़रूरत होगी. साथ ही, जियोफ़ेंस ट्रांज़िशन होने पर, Location Services से भेजे गए इंटेंट को मैनेज करने के लिए, इस सेक्शन में दिखाए गए तरीके से PendingIntent तय किया जा सकता है.

ध्यान दें: एक उपयोगकर्ता वाले डिवाइसों पर, हर ऐप्लिकेशन के लिए 100 जियोफ़ेंस सेट की जा सकती हैं. एक से ज़्यादा उपयोगकर्ता वाले डिवाइसों पर, हर उपयोगकर्ता के लिए हर ऐप्लिकेशन के लिए 100 जियोफ़ेंस सेट की जा सकती हैं.

जियोफ़ेंस ऑब्जेक्ट बनाएं

सबसे पहले, Geofence.Builder का इस्तेमाल करके जियोफ़ेंस बनाएं. इसके लिए, जियोफ़ेंस के लिए अपनी पसंद के दायरे, अवधि, और ट्रांज़िशन टाइप सेट करें. उदाहरण के लिए, किसी लिस्ट ऑब्जेक्ट को पॉप्युलेट करने के लिए:

Kotlin

geofenceList.add(Geofence.Builder()
        // Set the request ID of the geofence. This is a string to identify this
        // geofence.
        .setRequestId(entry.key)

        // Set the circular region of this geofence.
        .setCircularRegion(
                entry.value.latitude,
                entry.value.longitude,
                Constants.GEOFENCE_RADIUS_IN_METERS
        )

        // Set the expiration duration of the geofence. This geofence gets automatically
        // removed after this period of time.
        .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)

        // Set the transition types of interest. Alerts are only generated for these
        // transition. We track entry and exit transitions in this sample.
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)

        // Create the geofence.
        .build())

Java

geofenceList.add(new Geofence.Builder()
    // Set the request ID of the geofence. This is a string to identify this
    // geofence.
    .setRequestId(entry.getKey())

    .setCircularRegion(
            entry.getValue().latitude,
            entry.getValue().longitude,
            Constants.GEOFENCE_RADIUS_IN_METERS
    )
    .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
    .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
            Geofence.GEOFENCE_TRANSITION_EXIT)
    .build());

इस उदाहरण में, किसी कॉन्स्टेंट फ़ाइल से डेटा खींचा गया है. असल में, ऐप्लिकेशन उपयोगकर्ता की जगह के आधार पर, डाइनैमिक तौर पर जियोफ़ेंस बना सकते हैं.

जियोफ़ेंस और शुरुआती ट्रिगर तय करना

यहां दिया गया स्निपेट, GeofencingRequest क्लास और उसके नेस्ट किए गए GeofencingRequestBuilder क्लास का इस्तेमाल करके, मॉनिटर करने के लिए जियोफ़ेंस तय करता है. साथ ही, यह भी सेट करता है कि जियोफ़ेंस से जुड़े इवेंट कैसे ट्रिगर किए जाते हैं:

Kotlin

private fun getGeofencingRequest(): GeofencingRequest {
    return GeofencingRequest.Builder().apply {
        setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
        addGeofences(geofenceList)
    }.build()
}

Java

private GeofencingRequest getGeofencingRequest() {
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
    builder.addGeofences(geofenceList);
    return builder.build();
}

इस उदाहरण में, दो जियोफ़ेंस ट्रिगर का इस्तेमाल दिखाया गया है. जब कोई डिवाइस जियोफ़ेंस में प्रवेश करता है, तो GEOFENCE_TRANSITION_ENTER ट्रांज़िशन ट्रिगर होता है. वहीं, जब कोई डिवाइस जियोफ़ेंस से बाहर निकलता है, तो GEOFENCE_TRANSITION_EXIT ट्रांज़िशन ट्रिगर होता है. INITIAL_TRIGGER_ENTER की वैल्यू तय करने पर, Location services को यह जानकारी मिलती है कि अगर डिवाइस पहले से ही जियोफ़ेंस में है, तो GEOFENCE_TRANSITION_ENTER को ट्रिगर किया जाना चाहिए.

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

जियोफ़ेंस ट्रांज़िशन के लिए ब्रॉडकास्ट रिसीवर तय करना

जगह की जानकारी से जुड़ी सेवाओं से भेजे गए Intent से, आपके ऐप्लिकेशन में कई तरह की कार्रवाइयां ट्रिगर हो सकती हैं. हालांकि, आपको इससे कोई ऐक्टिविटी या फ़्रैगमेंट शुरू नहीं करना चाहिए, क्योंकि कॉम्पोनेंट उपयोगकर्ता की कार्रवाई के जवाब में ही दिखते हैं. कई मामलों में, BroadcastReceiver, जियोफ़ेंस ट्रांज़िशन को मैनेज करने का एक अच्छा तरीका है. किसी इवेंट के होने पर, BroadcastReceiver को अपडेट मिलते हैं. जैसे, किसी जियोफ़ेंस में या उससे बाहर ट्रांज़िशन होना. साथ ही, यह बैकग्राउंड में लंबे समय तक चलने वाला काम शुरू कर सकता है.

यहां दिए गए स्निपेट में, BroadcastReceiver शुरू करने वाले PendingIntent को तय करने का तरीका बताया गया है:

Kotlin

class MainActivity : AppCompatActivity() {

    // ...

    private val geofencePendingIntent: PendingIntent by lazy {
        val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
}

Java

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (geofencePendingIntent != null) {
            return geofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        return geofencePendingIntent;
    }

जियोफ़ेंस जोड़ना

जियोफ़ेंस जोड़ने के लिए, GeofencingClient.addGeofences() तरीके का इस्तेमाल करें. GeofencingRequest ऑब्जेक्ट और PendingIntent दें. नीचे दिए गए स्निपेट में, नतीजों को प्रोसेस करने का तरीका बताया गया है:

Kotlin

geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences added
        // ...
    }
    addOnFailureListener {
        // Failed to add geofences
        // ...
    }
}

Java

geofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences added
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to add geofences
                // ...
            }
        });

जियोफ़ेंस के ट्रांज़िशन को हैंडल करना

जब जगह की जानकारी से जुड़ी सेवाओं को यह पता चलता है कि उपयोगकर्ता जियोफ़ेंस में शामिल हो गया है या उससे बाहर निकल गया है, तब वह PendingIntent में शामिल Intent को भेजती है. आपने जियोफ़ेंस जोड़ने के अनुरोध में इसे शामिल किया था. GeofenceBroadcastReceiver जैसा ब्रॉडकास्ट रिसीवर यह देखता है कि Intent को शुरू किया गया है. इसके बाद, वह इंटेंट से जियोफ़ेंसिंग इवेंट हासिल कर सकता है, जियोफ़ेंस ट्रांज़िशन का टाइप तय कर सकता है, और तय कर सकता है कि तय किए गए कौनसे जियोफ़ेंस ट्रिगर हुए. ब्रॉडकास्ट रिसीवर, किसी ऐप्लिकेशन को बैकग्राउंड में काम करने के लिए निर्देश दे सकता है. इसके अलावा, वह ज़रूरत पड़ने पर आउटपुट के तौर पर सूचना भी भेज सकता है.

ध्यान दें: Android 8.0 (एपीआई लेवल 26) और इसके बाद के वर्शन पर, अगर कोई ऐप्लिकेशन जियोफ़ेंस की निगरानी करते समय बैकग्राउंड में चल रहा है, तो डिवाइस हर कुछ मिनटों में जियोफ़ेंसिंग इवेंट का जवाब देता है. अपने ऐप्लिकेशन को इन जवाब की सीमाओं के हिसाब से बनाने का तरीका जानने के लिए, बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की सीमाएं देखें.

यहां दिए गए स्निपेट में, ऐसा BroadcastReceiver तय करने का तरीका बताया गया है जो जियोफ़ेंस ट्रांज़िशन होने पर सूचना पोस्ट करता है. जब उपयोगकर्ता सूचना पर क्लिक करता है, तो ऐप्लिकेशन की मुख्य गतिविधि दिखती है:

Kotlin

class GeofenceBroadcastReceiver : BroadcastReceiver() {
    // ...
    override fun onReceive(context: Context?, intent: Intent?) {
        val geofencingEvent = GeofencingEvent.fromIntent(intent)
        if (geofencingEvent.hasError()) {
            val errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(geofencingEvent.errorCode)
            Log.e(TAG, errorMessage)
            return
        }

        // Get the transition type.
        val geofenceTransition = geofencingEvent.geofenceTransition

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER |
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            val triggeringGeofences = geofencingEvent.triggeringGeofences

            // Get the transition details as a String.
            val geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            )

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails)
            Log.i(TAG, geofenceTransitionDetails)
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition))
        }
    }
}

Java

public class GeofenceBroadcastReceiver extends BroadcastReceiver {
    // ...
    protected void onReceive(Context context, Intent intent) {
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if (geofencingEvent.hasError()) {
            String errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(geofencingEvent.getErrorCode());
            Log.e(TAG, errorMessage);
            return;
        }

        // Get the transition type.
        int geofenceTransition = geofencingEvent.getGeofenceTransition();

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

            // Get the transition details as a String.
            String geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            );

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails);
            Log.i(TAG, geofenceTransitionDetails);
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition));
        }
    }
}

PendingIntent की मदद से ट्रांज़िशन इवेंट का पता लगाने के बाद, BroadcastReceiver को जियोफ़ेंस ट्रांज़िशन टाइप मिलता है और यह जांच की जाती है कि यह उन इवेंट में से एक है या नहीं जिनका इस्तेमाल ऐप्लिकेशन, सूचनाएं ट्रिगर करने के लिए करता है. इस मामले में, यह जांच की जाती है कि यह इवेंट GEOFENCE_TRANSITION_ENTER या GEOFENCE_TRANSITION_EXIT है. इसके बाद, यह सेवा एक सूचना भेजती है और ट्रांज़िशन की जानकारी को लॉग करती है.

जियोफ़ेंस मॉनिटरिंग बंद करें

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

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

Kotlin

geofencingClient?.removeGeofences(geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences removed
        // ...
    }
    addOnFailureListener {
        // Failed to remove geofences
        // ...
    }
}

Java

geofencingClient.removeGeofences(getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences removed
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to remove geofences
                // ...
            }
        });

जगह की जानकारी से जुड़ी अन्य सुविधाओं के साथ, जियोफ़ेंसिंग का इस्तेमाल किया जा सकता है. जैसे, समय-समय पर जगह की जानकारी अपडेट करना. ज़्यादा जानकारी के लिए, इस क्लास के अन्य लेसन देखें.

जियोफ़ेंसिंग के लिए सबसे सही तरीके इस्तेमाल करना

इस सेक्शन में, Android के लिए लोकेशन एपीआई के साथ जियोफ़ेंसिंग का इस्तेमाल करने से जुड़े सुझावों के बारे में बताया गया है.

बिजली की खपत कम करना

जियोफ़ेंसिंग का इस्तेमाल करने वाले ऐप्लिकेशन में, बैटरी की खपत को ऑप्टिमाइज़ करने के लिए, इन तरीकों का इस्तेमाल किया जा सकता है:

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

  • उन जगहों के लिए ज़्यादा दायरे वाली जियोफ़ेंस का इस्तेमाल करें जहां उपयोगकर्ता काफ़ी समय बिताता है. जैसे, घर या ऑफ़िस. दायरे का बड़ा होना, सीधे तौर पर बिजली की खपत को कम नहीं करता. हालांकि, इससे ऐप्लिकेशन के प्रवेश या बाहर निकलने की जांच करने की फ़्रीक्वेंसी कम हो जाती है. इससे, बिजली की कुल खपत कम हो जाती है.

अपनी जियोफ़ेंस के लिए सबसे सही दायरा चुनना

सबसे अच्छे नतीजे पाने के लिए, जियोफ़ेंस का दायरा कम से कम 100 से 150 मीटर के बीच होना चाहिए. वाई-फ़ाई की सुविधा उपलब्ध होने पर, जगह की सटीक जानकारी आम तौर पर 20 से 50 मीटर के बीच होती है. अगर अंदर की जगह की जानकारी उपलब्ध है, तो जगह की सटीक जानकारी की रेंज 5 मीटर तक हो सकती है. अगर आपको यह नहीं पता है कि जियोफ़ेंस के अंदर इनडोर जगह की जानकारी उपलब्ध है या नहीं, तो मान लें कि वाई-फ़ाई की मदद से जगह की जानकारी 50 मीटर तक सटीक है.

जब वाई-फ़ाई जगह की जानकारी उपलब्ध न हो (उदाहरण के लिए, जब आप गांव में ड्राइव कर रहे हों), तो जगह की सटीक जानकारी कम हो जाती है. सटीक होने की रेंज, कई सौ मीटर से लेकर कई किलोमीटर तक बड़ी हो सकती है. ऐसे मामलों में, आपको ज़्यादा त्रिज्या का इस्तेमाल करके जियोफ़ेंस बनानी चाहिए.

उपयोगकर्ताओं को बताएं कि आपका ऐप्लिकेशन, जगह की जानकारी के आधार पर सेवा देने की सुविधा का इस्तेमाल क्यों करता है

जियोफ़ेंसिंग का इस्तेमाल करने पर, आपका ऐप्लिकेशन बैकग्राउंड में जगह की जानकारी ऐक्सेस करता है. इसलिए, यह देखें कि आपका ऐप्लिकेशन, उपयोगकर्ताओं को क्या फ़ायदे देता है. उन्हें साफ़ तौर पर बताएं कि उपयोगकर्ताओं को बेहतर तरीके से समझाने और पारदर्शिता बनाए रखने के लिए, आपके ऐप्लिकेशन को इस ऐक्सेस की ज़रूरत क्यों है.

जगह की जानकारी ऐक्सेस करने के सबसे सही तरीकों के बारे में ज़्यादा जानने के लिए, निजता के सबसे सही तरीकों वाला पेज देखें. इसमें जगह की जानकारी के लिए जियोफ़ेंसिंग की सुविधा भी शामिल है.

सूचना के स्पैम को कम करने के लिए, डवेल ट्रांज़िशन टाइप का इस्तेमाल करना

अगर किसी जियोफ़ेंस से थोड़े समय के लिए गुज़रने पर आपको बहुत ज़्यादा सूचनाएं मिलती हैं, तो सूचनाओं को कम करने का सबसे अच्छा तरीका यह है कि GEOFENCE_TRANSITION_ENTER के बजाय GEOFENCE_TRANSITION_DWELL टाइप के ट्रांज़िशन का इस्तेमाल करें. इस तरह, घर में मौजूद होने की चेतावनी सिर्फ़ तब भेजी जाती है, जब उपयोगकर्ता किसी तय समय के लिए, जियोफ़ेंस के अंदर रुक जाता है. लोटरिंग डिले सेट करके, अवधि चुनी जा सकती है.

ज़रूरत पड़ने पर ही जियोफ़ेंस को फिर से रजिस्टर करें

रजिस्टर की गई जियोफ़ेंस, com.google.android.gms पैकेज के मालिकाना हक वाली com.google.process.location प्रोसेस में रखी जाती हैं. ऐप्लिकेशन को नीचे दिए गए इवेंट को मैनेज करने के लिए कुछ भी करने की ज़रूरत नहीं है, क्योंकि इन इवेंट के बाद सिस्टम जियोफ़ेंस को फिर से चालू कर देता है:

  • Google Play services को अपग्रेड किया गया हो.
  • रिसॉर्स की पाबंदी की वजह से, Google Play services को सिस्टम बंद कर देता है और फिर से शुरू कर देता है.
  • जगह की जानकारी की प्रोसेस क्रैश हो जाती है.

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

  • डिवाइस को फिर से चालू किया गया है. ऐप्लिकेशन को डिवाइस के बूट होने की कार्रवाई के लिए सुनना चाहिए. इसके बाद, ज़रूरी जियोफ़ेंस को फिर से रजिस्टर करना चाहिए.
  • ऐप्लिकेशन को अनइंस्टॉल करके फिर से इंस्टॉल किया जाता है.
  • ऐप्लिकेशन का डेटा मिट जाता है.
  • Google Play services का डेटा मिट जाता है.
  • ऐप्लिकेशन को GEOFENCE_NOT_AVAILABLE से जुड़ी सूचना मिली है. आम तौर पर, ऐसा एनएलपी (Android का नेटवर्क लोकेशन प्रोवाइडर) बंद होने के बाद होता है.

जियोफ़ेंस के एंट्रेंस इवेंट से जुड़ी समस्या हल करना

अगर डिवाइस किसी जियोफ़ेंस में प्रवेश करने पर, जियोफ़ेंस ट्रिगर नहीं हो रहे हैं ( GEOFENCE_TRANSITION_ENTER सूचना ट्रिगर नहीं हो रही है), तो सबसे पहले पक्का करें कि आपकी जियोफ़ेंस, इस गाइड में बताए गए तरीके से सही तरीके से रजिस्टर की गई हों.

यहां चेतावनियों के उम्मीद के मुताबिक काम न करने की कुछ संभावित वजहें बताई गई हैं:

  • आपके जियोफ़ेंस में जगह की सटीक जानकारी उपलब्ध नहीं है या जियोफ़ेंस बहुत छोटा है. ज़्यादातर डिवाइसों पर, जियोफ़ेंस सेवा, जियोफ़ेंस ट्रिगर करने के लिए सिर्फ़ नेटवर्क की जगह की जानकारी का इस्तेमाल करती है. यह सेवा इस तरीके का इस्तेमाल इसलिए करती है, क्योंकि नेटवर्क की जगह की जानकारी पाने में बहुत कम बैटरी खर्च होती है. साथ ही, अलग-अलग जगहों की जानकारी पाने में कम समय लगता है. सबसे अहम बात यह है कि यह सेवा घर के अंदर भी काम करती है.
  • डिवाइस पर वाई-फ़ाई बंद है. वाई-फ़ाई चालू होने पर, जगह की जानकारी को ज़्यादा सटीक बनाया जा सकता है. इसलिए, अगर वाई-फ़ाई बंद है, तो हो सकता है कि आपके ऐप्लिकेशन को कभी भी जियोफ़ेंस से जुड़ी चेतावनियां न मिलें. यह कई सेटिंग पर निर्भर करता है. जैसे, जियोफ़ेंस की त्रिज्या, डिवाइस मॉडल या Android वर्शन. हमने Android 4.3 (एपीआई लेवल 18) से, “सिर्फ़ वाई-फ़ाई स्कैन मोड” की सुविधा जोड़ी है. इसकी मदद से, उपयोगकर्ता वाई-फ़ाई बंद करके भी नेटवर्क की जगह की जानकारी को बेहतर तरीके से ऐक्सेस कर सकते हैं. अगर वाई-फ़ाई और सिर्फ़ वाई-फ़ाई स्कैन मोड, दोनों बंद हैं, तो उपयोगकर्ता को इसकी सूचना देना और उन्हें इनमें से किसी एक को चालू करने का शॉर्टकट देना अच्छा होता है. SettingsClient का इस्तेमाल करके, पक्का करें कि डिवाइस की सिस्टम सेटिंग, जगह की जानकारी का बेहतर तरीके से पता लगाने के लिए सही तरीके से कॉन्फ़िगर की गई हों.

    ध्यान दें: अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) या इसके बाद के वर्शन को टारगेट करता है, तो सीधे WifiManager.setEnabled() को कॉल नहीं किया जा सकता. ऐसा तब तक नहीं किया जा सकता, जब तक आपका ऐप्लिकेशन कोई सिस्टम ऐप्लिकेशन या डिवाइस नीति कंट्रोलर (डीपीसी) न हो. इसके बजाय, सेटिंग पैनल का इस्तेमाल करें.

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

अन्य संसाधन

जियोफ़ेंसिंग के बारे में ज़्यादा जानने के लिए, नीचे दिए गए लेख पढ़ें:

सैंपल

जियोफ़ेंस बनाने और उनकी निगरानी करने के लिए, सैंपल ऐप्लिकेशन.