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