Fence API 개요

Awareness API에서 펜스 개념은 지오펜싱에서 가져왔습니다. 지오펜싱에서는 지리적 영역 또는 지오펜스가 정의되고 사용자가 지오펜스 영역에 들어가거나 나갈 때 앱이 콜백을 수신합니다. Fence API는 지리적 근접성 외에도 다른 많은 컨텍스트 조건을 포함하도록 지오펜싱 개념을 확장합니다. 컨텍스트 상태가 전환될 때마다 앱은 콜백을 수신합니다. 예를 들어 앱이 헤드폰의 울타리를 정의하면 헤드폰이 연결될 때와 연결 해제될 때 콜백이 수신됩니다.

Fence API를 사용하여 다음과 같은 컨텍스트 신호를 기반으로 한 울타리를 정의할 수 있습니다.

  • 사용자의 현재 위치 (위도/경도)
  • 걷기, 운전 등 사용자의 현재 활동
  • 헤드폰 연결 여부와 같은 기기별 조건
  • 근처 비콘과의 근접성

Fence API를 사용하면 여러 컨텍스트 신호를 결합하여 AND, OR, NOT 불리언 연산자로 울타리를 만들 수 있습니다. 그런 다음 앱은 울타리 조건이 충족될 때마다 콜백을 수신합니다. 가능한 울타리의 몇 가지 예는 다음과 같습니다.

  • 사용자가 헤드폰을 연결하고 걷기 시작합니다.
  • 사용자가 평일 오후 5시 전에 100미터 지오펜스에 진입합니다.
  • 사용자가 특정 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);
        }
    }
}