Fence API

In der Awareness API wird das Konzept von Zäunen aus dem Geofencing abgeleitet, in dem eine geografische Region oder ein Geofence definiert ist. Eine App erhält dann Callbacks, wenn ein Nutzer die Geofence-Region betritt oder verlässt. Die Fence API erweitert das Konzept des Geofencings und bietet neben der geografischen Nähe noch viele weitere Kontextbedingungen. Eine App empfängt Callbacks, wenn der Kontextzustand gewechselt wird. Wenn Ihre App beispielsweise einen Zaun für Kopfhörer definiert, erhält sie Callbacks, wenn die Kopfhörer angeschlossen und vom Stromnetz getrennt sind.

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

  • Der aktuelle Standort des Nutzers (Breiten-/Längengrad)
  • Die aktuelle Aktivität des Nutzers, z. B. Gehen oder Auto.
  • Gerätespezifische Bedingungen, beispielsweise ob der Kopfhörer angeschlossen ist.
  • 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 mögliche Zäune:

  • Der Nutzer schließt den Kopfhörer an und geht los.
  • Der Nutzer gibt an einem Wochentag vor 17 Uhr einen 100-Meter-Geofence ein.
  • Der Nutzer gibt den Bereich eines bestimmten BLE-Beacons ein.

Das folgende Beispiel zeigt, wie ein Zaun definiert wird, der sich jedes Mal aktiviert, wenn der Nutzer geht:

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

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

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

Das folgende Beispiel zeigt eine Methode zum Erstellen und Registrieren eines Zauns. In diesem Beispiel wird eine benutzerdefinierte Unterklasse von BroadcastReceiver verwendet, um die Absicht beim Auslösen des Zauns zu verarbeiten.

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