در Awareness API، مفهوم حصار از حصار جغرافیایی گرفته شده است، که در آن یک منطقه جغرافیایی، یا حصار جغرافیایی، تعریف میشود و یک برنامه هنگامی که کاربر وارد منطقه حصار جغرافیایی میشود یا آن را ترک میکند، تماسهای برگشتی دریافت میکند. Fence API مفهوم حصار جغرافیایی را گسترش میدهد تا علاوهبر نزدیکی جغرافیایی، شرایط زمینهای دیگری را نیز دربرگیرد. هرگاه وضعیت زمینه تغییر کند، برنامه تماس برگشتی دریافت میکند. برای مثال، اگر برنامه شما حصاری برای هدفون تعریف کند، وقتی هدفون وصل میشود و وقتی هدفون جدا میشود، تماسهای برگشتی دریافت میکند.
میتوانید از Fence API برای تعریف حصار براساس نشانهای زمینهای مثل موارد زیر استفاده کنید:
- مکان کنونی کاربر (عرض/طول جغرافیایی)
- فعالیت کنونی کاربر، مثل پیادهروی یا رانندگی.
- شرایط خاص دستگاه، مثلاً اینکه هدفون متصل است یا نه.
- نزدیکی به چراغهای راهنمای اطراف
Fence API به شما امکان میدهد چندین
نشان زمینهای
را ترکیب کنید تا بااستفاده از عملگرهای بولی AND، OR، و NOT حصار ایجاد کنید. سپس هرگاه شرایط حصار برآورده شود، برنامهتان
فراخوانیهای برگشتی را دریافت میکند. برخیاز نمونههای
حصارکشیهای احتمالی عبارتاند از:
- کاربر هدفون را متصل میکند و شروع به راه رفتن میکند.
- کاربر قبلاز ساعت ۵ بعدازظهر در روزهای هفته وارد حصار جغرافیایی ۱۰۰ متری میشود.
- کاربر وارد محدوده چراغ راهنمای 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);
}
}
}