نظرة عامة على واجهة برمجة تطبيقات "Fence API"

في Awareness API، يتمّ استخراج مفهوم السياج من الحدّ الجغرافي، الذي يتمّ فيه تحديد منطقة جغرافية أو حدّ جغرافي، ويتلقّى التطبيق طلبات إعادة الاتصال عندما يدخل المستخدِم منطقة الحدّ الجغرافي أو يغادرها. تتوسّع واجهة برمجة التطبيقات Fence API في مفهوم وضع حدود جغرافية لتضمين العديد من شروط السياق الأخرى بالإضافة إلى القرب الجغرافي. يتلقّى التطبيق استدعاءات عند تغيُّر حالة السياق. على سبيل المثال، إذا حدّد تطبيقك حدودًا لسماعات الرأس، سيتلقّى مكالمات استرجاعية عند توصيل سماعات الرأس وعند فصلها.

يمكنك استخدام Fence API لتحديد حدود المناطق بناءً على إشارات السياق، مثل ما يلي:

  • الموقع الجغرافي الحالي للمستخدم (خط الطول/خط العرض)
  • النشاط الحالي للمستخدم، مثل المشي أو القيادة
  • الشروط الخاصة بالجهاز، مثل ما إذا كانت سماعات الرأس متصلة أم لا
  • القرب من أجهزة الإرسال والاستقبال القريبة

تتيح لك واجهة برمجة التطبيقات Fence API الجمع بين عدة إشارات سياق لإنشاء أسوار باستخدام عوامل التشغيل المنطقية AND وOR وNOT. بعد ذلك، يتلقّى تطبيقك callbacks عند استيفاء شروط السياج. في ما يلي بعض الأمثلة على الأسوار المحتمَلة:

  • يوصل المستخدم سماعات الرأس ويبدأ بالمشي.
  • يدخل المستخدم في حدود منطقة جغرافية بمساحة 100 متر قبل الساعة 5 مساءً في أحد أيام الأسبوع.
  • يدخل المستخدم في نطاق إشارة 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);
        }
    }
}