Przegląd Fence API

W interfejsie Awareness API pojęcie obszarów pochodzi z geofencingu, w którym definiuje się region geograficzny, czyli obszar, a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi na ten obszar lub go opuszcza. Interfejs Fence API rozszerza koncepcję geofencingu, aby uwzględniać wiele innych warunków kontekstowych oprócz bliskości geograficznej. Aplikacja otrzymuje wywołania zwrotne za każdym razem, gdy zmienia się stan kontekstu. Jeśli na przykład aplikacja definiuje strefę dla słuchawek, otrzymuje wywołania zwrotne, gdy słuchawki są podłączone i gdy są odłączone.

Za pomocą interfejsu Fence API możesz definiować ogrodzenia na podstawie sygnałów kontekstowych, takich jak:

  • bieżąca lokalizacja użytkownika (szerokość i długość geograficzna);
  • bieżącą aktywność użytkownika, np. chodzenie lub jazdę samochodem;
  • warunki dotyczące konkretnego 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ń z operatorami logicznymi AND, ORNOT. Aplikacja otrzymuje wywołania zwrotne za każdym razem, gdy zostaną spełnione warunki ogrodzenia. Oto przykłady możliwych ogrodzeń:

  • Użytkownik podłącza słuchawki i zaczyna iść.
  • Użytkownik wchodzi na obszar o promieniu 100 metrów przed godziną 17:00 w dzień powszedni.
  • Użytkownik wchodzi w zasięg określonego beacona BLE.

Poniższy przykład pokazuje, jak zdefiniować obszar, który aktywuje się, gdy użytkownik idzie:

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

Po zdefiniowaniu obszaru musisz wykonać te czynności:

  • Zadzwoń pod numer updateFences, aby zarejestrować ogrodzenie i otrzymywać połączenia zwrotne.
  • Zdefiniuj wywołanie zwrotne, które można wywołać, gdy zmieni się stan obszaru.

Poniższy przykład pokazuje metodę, która tworzy i rejestruje obszar. W tym przykładzie niestandardowa podklasa BroadcastReceiver służy do obsługi intencji po wywołaniu obszaru.

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