Fence API

In der Awareness API basiert das Konzept der Zäune auf dem Geofencing, in dem eine geografische Region oder ein Geofence definiert wird. Eine App erhält Callbacks, wenn ein Nutzer die Geofence-Region betritt oder verlässt. Die Fence API erweitert das Konzept des Geofencing um viele weitere Kontextbedingungen neben der geografischen Nähe. Eine Anwendung empfängt Callbacks, wenn der Kontextzustand wechselt. Wenn Ihre App beispielsweise einen Zaun für Kopfhörer definiert, erhalten sie Callbacks, wenn die Kopfhörer eingesteckt sind und nicht verbunden sind.

Mit der Fence API können Sie Zäune anhand von Kontextsignalen definieren, z. B.:

  • Aktueller Standort des Nutzers (Breiten-/Längengrad)
  • Aktuelle Aktivität des Nutzers, z. B. Gehen oder Autofahren
  • Gerätespezifische Bedingungen, z. B. ob die Kopfhörer angeschlossen sind
  • Nähe zu Beacons in der Nähe

Mit der Fence API können Sie mehrere Kontextsignale kombinieren, um Zäune mit den booleschen Operatoren AND, OR und NOT zu erstellen. Ihre App empfängt dann Callbacks, wenn die Zaunbedingungen erfüllt sind. Hier sind einige Beispiele für mögliche Zäune:

  • Nutzer steckt Kopfhörer ein und geht weiter.
  • Der Nutzer gibt an einem Wochentag vor 17:00 Uhr einen 100 m langen Geofence ein.
  • Der Nutzer gibt den Bereich eines bestimmten BLE-Beacons ein.

Das folgende Beispiel zeigt, wie ein Zaun definiert wird, der aktiviert wird, wenn der Nutzer zu Fuß geht:

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

Nachdem Sie einen Zaun definiert haben, müssen Sie Folgendes tun:

  • Rufe updateFences auf, um den Zaun für Callbacks zu registrieren.
  • Definiere einen Callback, der aufgerufen werden kann, wenn sich der Zaunstatus ändert.

Das folgende Beispiel zeigt eine Methode, mit der Zäune erstellt und registriert werden. In diesem Beispiel wird eine benutzerdefinierte Unterklasse von BroadcastReceiver verwendet, um den Intent zu verarbeiten, wenn der Zaun ausgelöst wird.

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