סקירה כללית של גדר גדר

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

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

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

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

  • המשתמש מתחבר לאוזניות ומתחיל ללכת.
  • המשתמש נכנס לגבולות וירטואליים באורך 100 מטר לפני 17:00 ביום חול.
  • המשתמש מזין טווח של משׂואת רשת (beacon) ספציפית ב-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);
        }
    }
}