סקירה כללית של Fence API

ב-Awareness API, המושג גדרות נלקח מגבולות וירטואליים, שבהם מוגדר אזור גיאוגרפי, או גבול וירטואלי, ואפליקציה מקבלת קריאות חוזרות (callbacks) כשמשתמש נכנס לאזור הגבול הווירטואלי או יוצא ממנו. ‫Fence API מרחיב את הקונספט של גבולות וירטואליים וכולל תנאים רבים אחרים בהקשר, בנוסף לקרבה גיאוגרפית. האפליקציה מקבלת קריאות חוזרות (callbacks) בכל פעם שהמצב של ההקשר משתנה. לדוגמה, אם האפליקציה מגדירה גדר לאוזניות, היא מקבלת קריאות חוזרות (callbacks) כשהאוזניות מחוברות וכשהן מנותקות.

אתם יכולים להשתמש ב-Fence API כדי להגדיר גדרות על סמך אותות הקשר, כמו:

  • המיקום הנוכחי של המשתמש (קו רוחב/קו אורך)
  • הפעילות הנוכחית של המשתמש, כמו הליכה או נהיגה.
  • תנאים ספציפיים למכשיר, כמו אם האוזניות מחוברות.
  • קרבה למשואות סמוכות

באמצעות Fence API אפשר לשלב כמה אותות הקשר כדי ליצור גדרות עם האופרטורים הבוליאניים AND,‏ OR ו-NOT. לאחר מכן, האפליקציה מקבלת קריאות חוזרות (callbacks) בכל פעם שהתנאים של הגדרת הגדר הווירטואלית מתקיימים. דוגמאות לגדרות אפשריות:

  • המשתמש מחבר אוזניות ומתחיל ללכת.
  • המשתמש נכנס לגבול וירטואלי של 100 מטר לפני השעה 17:00 ביום חול.
  • המשתמש נכנס לטווח של משואת BLE ספציפית.

בדוגמה הבאה מוסבר איך להגדיר גדר שמופעלת בכל פעם שהמשתמש הולך:

AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);

אחרי שמגדירים גדר, צריך לבצע את הפעולות הבאות:

  • קוראים ל-updateFences כדי לרשום את הגדר הווירטואלית לקבלת קריאות חוזרות (callbacks).
  • מגדירים קריאה חוזרת (callback) שאפשר להפעיל כשמצב הגדרת הגדר הווירטואלית משתנה.

בדוגמה הבאה מוצגת שיטה שיוצרת ורושמת גדר. בדוגמה הזו, מחלקת משנה מותאמת אישית של BroadcastReceiver משמשת לטיפול ב-Intent כשהגדר מופעלת.

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);
        }
    }
}