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

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

एक से ज़्यादा चालू जियोफ़ेंस हो सकते हैं. हालांकि, हर ऐप्लिकेशन के लिए, डिवाइस इस्तेमाल करने वाले हर व्यक्ति के हिसाब से, इनकी संख्या 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/>

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

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

जियोफ़ेंस बनाना और उन्हें जोड़ना

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

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

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

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

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

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
                // ...
            }
        });

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

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

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

यहां दिए गए स्निपेट में, BroadcastReceiver को तय करने का तरीका बताया गया है. यह 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 के लिए लोकेशन एपीआई के साथ जियोफ़ेंसिंग का इस्तेमाल करने के बारे में सुझाव दिए गए हैं.

ऊर्जा की खपत कम करना

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

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

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

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

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

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

अन्य संसाधन

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

सैंपल

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