في Awareness API، تم استلهام مفهوم الأسوار من تحديد الموقع الجغرافي، حيث يتم تحديد منطقة جغرافية أو سياج جغرافي، ويتلقّى التطبيق عمليات ردّ عند دخول المستخدم إلى منطقة السياج الجغرافي أو مغادرتها. توسّع واجهة برمجة التطبيقات Fence API مفهوم السياج الجغرافي ليشمل العديد من الشروط السياقية الأخرى بالإضافة إلى القرب الجغرافي. يتلقّى التطبيق عمليات ردّ الاتصال كلما انتقلت حالة السياق. على سبيل المثال، إذا كان تطبيقك يحدّد سياجًا جغرافيًا لسماعات الرأس، سيتلقّى عمليات ردّ الاتصال عند توصيل سماعات الرأس وعند فصلها.
يمكنك استخدام Fence API لتحديد الحدود استنادًا إلى إشارات السياق، مثل ما يلي:
- الموقع الجغرافي الحالي للمستخدم (خط العرض/خط الطول)
- النشاط الحالي للمستخدم، مثل المشي أو القيادة
- الشروط الخاصة بالجهاز، مثل ما إذا كانت سماعات الرأس موصولة
- القرب من إشارات البلوتوث القريبة
تتيح لك Fence API الجمع بين عدة
إشارات سياقية
لإنشاء حواجز باستخدام عوامل التشغيل المنطقية AND وOR وNOT. بعد ذلك، يتلقّى تطبيقك عمليات ردّ الاتصال كلما تم استيفاء شروط السياج. في ما يلي بعض الأمثلة على الحدود المحتملة:
- يصل المستخدم سماعات الرأس ويبدأ بالمشي.
- يدخل المستخدم إلى سياج جغرافي يبلغ طوله 100 متر قبل الساعة 5 مساءً في أحد أيام الأسبوع.
- يدخل المستخدم نطاق إشارة BLE معيّنة.
يوضّح المثال التالي كيفية تحديد سياج جغرافي يتم تفعيله عندما يمشي المستخدم:
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);
}
}
}