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

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

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

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

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

  • משתמש מחבר אוזניות ומתחיל ללכת.
  • משתמש נכנס למתחם גיאוגרפית של 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);
        }
    }
}