نمای کلی Fence API

در Awareness API، مفهوم حصار از حصار جغرافیایی گرفته شده است، که در آن یک منطقه جغرافیایی، یا حصار جغرافیایی، تعریف می‌شود و برنامه زمانی که کاربر وارد منطقه حصار جغرافیایی می‌شود یا آن را ترک می‌کند، فراخوانی‌های برگشتی دریافت می‌کند. Fence API مفهوم حصار جغرافیایی را گسترش می‌دهد تا علاوه‌بر مجاورت جغرافیایی، بسیاری از شرایط زمینه‌ای دیگر را نیز دربرگیرد. هرزمان که وضعیت بافت تغییر کند، برنامه تماس‌های برگشتی دریافت می‌کند. برای مثال، اگر برنامه‌تان حصاری برای هدفون تعریف کند، وقتی هدفون وصل می‌شود و وقتی جدا می‌شود، فراخوانی‌های برگشتی دریافت می‌کند.

می‌توانید از Fence API برای تعریف حصارها براساس نشان‌های بافت، مانند موارد زیر، استفاده کنید:

  • مکان فعلی کاربر (عرض جغرافیایی/طول جغرافیایی)
  • فعالیت کنونی کاربر، مثل پیاده‌روی یا رانندگی.
  • شرایط خاص دستگاه، مثلاً اینکه هدفون متصل است یا نه.
  • نزدیکی به فانوس‌های اطراف

Fence API به شما امکان می‌دهد چندین سیگنال بافت را ترکیب کنید تا بااستفاده از عملگرهای بولی AND،‏ OR، و NOT حصار ایجاد کنید. سپس هرگاه شرایط حصار برآورده شود، برنامه‌تان فراخوانی‌های برگشتی را دریافت می‌کند. برخی‌از نمونه‌های حصار احتمالی شامل موارد زیر است:

  • کاربر هدفون را متصل می‌کند و شروع به راه رفتن می‌کند.
  • کاربر قبل‌از ساعت ۵ بعدازظهر در روزی غیرتعطیل وارد حصار جغرافیایی ۱۰۰ متری می‌شود.
  • کاربر وارد محدوده یک فانوسک 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);
        }
    }
}