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

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

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

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

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

  • يُوصِّل المستخدم سماعات الرأس ويبدأ في المشي.
  • يدخل المستخدم حدودًا جغرافية تبلغ 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);
        }
    }
}