Awareness API में, फ़ेंस का कॉन्सेप्ट, जियोफ़ेंसिंग से लिया गया है. इसमें किसी भौगोलिक क्षेत्र या जियोफ़ेंस को तय किया जाता है. इसके बाद, जब कोई उपयोगकर्ता जियोफ़ेंस वाले क्षेत्र में प्रवेश करता है या उससे बाहर निकलता है, तो ऐप्लिकेशन को कॉलबैक मिलते हैं. फ़ेंस एपीआई, जियोफ़ेंसिंग के कॉन्सेप्ट को और बेहतर बनाता है. इसमें भौगोलिक नज़दीकी के साथ-साथ, कॉन्टेक्स्ट से जुड़ी कई अन्य शर्तें भी शामिल की जाती हैं. जब भी कॉन्टेक्स्ट की स्थिति बदलती है, तब ऐप्लिकेशन को कॉलबैक मिलते हैं. उदाहरण के लिए, अगर आपका ऐप्लिकेशन हेडफ़ोन के लिए फ़ेंस तय करता है, तो हेडफ़ोन प्लग इन करने और अनप्लग करने पर, उसे कॉलबैक मिलते हैं.
कॉन्टेक्स्ट सिग्नल के आधार पर फ़ेंस तय करने के लिए, Fence API का इस्तेमाल किया जा सकता है. जैसे:
- उपयोगकर्ता की मौजूदा जगह की जानकारी (अक्षांश/देशांतर)
- उपयोगकर्ता की मौजूदा गतिविधि, जैसे कि पैदल चलना या गाड़ी चलाना.
- डिवाइस से जुड़ी शर्तें, जैसे कि हेडफ़ोन प्लग इन किए गए हैं या नहीं.
- आस-पास के बीकन से नज़दीकी
फ़ेंस एपीआई की मदद से, कई कॉन्टेक्स्ट सिग्नल को एक साथ इस्तेमाल किया जा सकता है. इससे AND
, OR
, और NOT
बूलियन ऑपरेटर के साथ फ़ेंस बनाए जा सकते हैं. इसके बाद, जब भी फ़ेंस की शर्तें पूरी होती हैं, तब आपका ऐप्लिकेशन कॉलबैक पाता है. संभावित फ़ेंस के कुछ उदाहरण यहां दिए गए हैं:
- उपयोगकर्ता हेडफ़ोन प्लग इन करता है और चलना शुरू करता है.
- उपयोगकर्ता, हफ़्ते के किसी दिन शाम 5 बजे से पहले 100 मीटर के जियोफ़ेंस में प्रवेश करता है.
- उपयोगकर्ता किसी खास बीएलई बीकन की रेंज में आता है.
यहां दिए गए उदाहरण में, ऐसे फ़ेंस को तय करने का तरीका बताया गया है जो उपयोगकर्ता के चलने पर चालू हो जाता है:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
जियोफ़ेंस तय करने के बाद, आपको ये काम करने होंगे:
- कॉल बैक पाने के लिए, फ़ेंस को रजिस्टर करने के लिए
updateFences
को कॉल करें. - एक ऐसा कॉलबैक तय करें जिसे फ़ेंस की स्थिति बदलने पर शुरू किया जा सके.
यहां दिए गए उदाहरण में, फ़ेंस बनाने और उसे रजिस्टर करने का तरीका बताया गया है. इस उदाहरण में, BroadcastReceiver
की कस्टम सबक्लास का इस्तेमाल किया गया है. इससे फ़ेंस ट्रिगर होने पर इंटेंट को हैंडल किया जा सकता है.
Awareness.getFenceClient(this).updateFences(new FenceUpdateRequest.Builder()
.addFence(FENCE_KEY, exercisingWithHeadphonesFence, mPendingIntent)
.build())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.i(TAG, "Fence was successfully registered.");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "Fence could not be registered: " + e);
}
});
public class FenceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
FenceState fenceState = FenceState.extract(intent);
if (TextUtils.equals(fenceState.getFenceKey(), FENCE_KEY)) {
String fenceStateStr;
switch (fenceState.getCurrentState()) {
case FenceState.TRUE:
fenceStateStr = "true";
break;
case FenceState.FALSE:
fenceStateStr = "false";
break;
case FenceState.UNKNOWN:
fenceStateStr = "unknown";
break;
default:
fenceStateStr = "unknown value";
}
mLogFragment.getLogView().println("Fence state: " + fenceStateStr);
}
}
}