Przegląd Fence API

W interfejsie Awareness API koncepcja ogrodzenia pochodzi z geofencingu, w którym zdefiniowano region geograficzny, czyli geofence, a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi do regionu geofence lub z niego wychodzi. Interfejs Fence API rozszerza pojęcie geofencingu o wiele inne warunki kontekstowe oprócz bliskości geograficznej. Aplikacja otrzymuje wywołania zwrotne, gdy stan kontekstu się zmienia. Jeśli na przykład Twoja aplikacja definiuje furtkę dla słuchawek, otrzymuje wywołania zwrotne, gdy słuchawki są podłączone i odłączone.

Możesz użyć interfejsu Fence API do definiowania barier na podstawie sygnałów kontekstowych, takich jak:

  • bieżąca lokalizacja użytkownika (szerokość/długość geograficzna);
  • Bieżąca aktywność użytkownika, np. chodzenie lub jazda samochodem.
  • warunki dotyczące urządzenia, np. czy słuchawki są podłączone;
  • Odległość od pobliskich beaconów

Interfejs Fence API umożliwia łączenie wielu sygnałów kontekstowych w celu tworzenia ogrodzeń za pomocą operatorów logicznych AND, ORNOT. Gdy warunki ogrodzenia zostaną spełnione, Twoja aplikacja będzie otrzymywać wywołania zwrotne. Przykłady możliwych ogrodzeń:

  • Użytkownik podłącza słuchawki i zaczyna chodzić.
  • Użytkownik wchodzi na obszar 100-metrowego geoogrodzenia w dni roboczym przed godziną 17:00.
  • Użytkownik wchodzi w zakres działania określonego nadajnika BLE.

Ten przykład pokazuje, jak zdefiniować ogrodzenie, które aktywuje się, gdy użytkownik się porusza:

AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);

Po zdefiniowaniu ogrodzenia:

  • Zadzwoń pod numer updateFences, aby zarejestrować ogrodzenie i otrzymywać połączenia zwrotne.
  • Zdefiniuj funkcję wywołania zwrotnego, która może być wywoływana, gdy zmieni się stan ogrodzenia.

W tym przykładzie pokazano metodę, która tworzy i rejestruje ogrodzenie. W tym przykładzie niestandardowa podklasa BroadcastReceiver służy do obsługi intencji po wywołaniu ogrodzenia.

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);
        }
    }
}