نظرة عامة على واجهة برمجة تطبيقات الأسيجة

في واجهة برمجة تطبيقات الوعي، يتم مفهوم الأسيجة من الحدود الجغرافية، التي يتم من خلالها تحديد منطقة جغرافية أو كسور جغرافي، ويتلقّى التطبيق استدعاءات معاودة الاتصال عندما يدخل المستخدم منطقة الحدود الجغرافية أو يغادرها. تتوسّع واجهة 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);
        }
    }
}