ב-Awareness API, המושג גדרות וירטואליות נלקח מגידור גיאוגרפי, שבו מוגדר אזור גיאוגרפי, או גדר וירטואלית, ואפליקציה מקבלת קריאות חוזרות (callback) כשמשתמש נכנס לאזור הגדר הווירטואלית או יוצא ממנו. ה-API של הגידור הגיאוגרפי מרחיב את הקונספט של גידור גיאוגרפי כך שיכלול תנאי הקשר רבים אחרים בנוסף לקרבה גיאוגרפית. אפליקציה מקבלת קריאות חוזרות (callback) בכל פעם שמצב ההקשר משתנה. לדוגמה, אם האפליקציה מגדירה גדר לאוזניות, היא מקבלת קריאות חוזרות (callback) כשהאוזניות מחוברות וכשהן מנותקות.
אפשר להשתמש ב-Fence API כדי להגדיר גדרות על סמך אותות הקשריים, כמו:
- המיקום הנוכחי של המשתמש (קו רוחב/קו אורך)
- הפעילות הנוכחית של המשתמש, כמו הליכה או נהיגה.
- תנאים ספציפיים למכשיר, כמו אם האוזניות מחוברות.
- קרבה למשואות בקרבת מקום
Fence API מאפשר לכם לשלב כמה אותות הקשר כדי ליצור גדרות באמצעות האופרטורים הבוליאניים AND, OR ו-NOT. לאחר מכן, האפליקציה מקבלת קריאות חוזרות (callback) בכל פעם שהתנאים של הגדרת הגדר מתקיימים. הנה כמה דוגמאות לגדרות אפשריות:
- משתמש מחבר אוזניות ומתחיל ללכת.
- משתמש נכנס לגדר הגיאוגרפית של 100 מטרים לפני השעה 17:00 ביום חול.
- משתמש נכנס לטווח של משואה ספציפית מסוג BLE.
בדוגמה הבאה אפשר לראות איך מגדירים גדר וירטואלית שמופעלת בכל פעם שהמשתמש הולך:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
אחרי שמגדירים גדר וירטואלית, צריך לבצע את הפעולות הבאות:
- מתקשרים אל
updateFencesכדי לרשום את הגדר הווירטואלי לקבלת קריאות חוזרות (callback). - מגדירים קריאה חוזרת שאפשר להפעיל כשהמצב של הגדרת הגדר משתנה.
בדוגמה הבאה מוצגת מתודה שיוצרת גדר וירטואלית ורושמת אותה. בדוגמה הזו, מחלקת משנה מותאמת אישית של 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);
}
}
}