Fence API

In der Awareness API stammt das Konzept der Fences aus dem Geofencing, dabei wird eine geografische Region oder ein Geofence definiert und 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 andere Kontextbedingungen zusätzlich zur geografischen Nähe. Eine App erhält Callbacks, wenn sich der Kontext status ändert. Wenn Ihre App beispielsweise einen Fence für Kopfhörer definiert, erhält sie Callbacks, wenn die Kopfhörer angeschlossen und wenn sie wieder getrennt werden.

Mit der Fence API können Sie Fences basierend auf 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 Fences mit den booleschen Operatoren AND, OR, und NOT zu erstellen. Ihre App erhält dann Callbacks, wenn die Fence-Bedingungen erfüllt sind. Einige Beispiele für mögliche Fences:

  • Nutzer schließt Kopfhörer an und beginnt zu gehen.
  • Nutzer betritt an einem Wochentag vor 17:00 Uhr einen Geofence mit einem Radius von 100 Metern.
  • Nutzer betritt den Bereich eines bestimmten BLE-Beacons.

Das folgende Beispiel zeigt, wie Sie einen Fence definieren, der immer dann aktiviert wird, wenn der Nutzer geht:

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

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

  • Rufen Sie updateFences auf, um den Fence zu registrieren und Callbacks zu erhalten.
  • Definieren Sie einen Callback, der aufgerufen werden kann, wenn sich der Fence-Status ändert.

Das folgende Beispiel zeigt eine Methode, mit der ein Fence erstellt und registriert wird. In diesem Beispiel wird eine benutzerdefinierte Unterklasse von BroadcastReceiver verwendet, um die Intent zu verarbeiten, wenn der Fence 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);
        }
    }
}