Fence API

In der Awareness API wird das Konzept von Geofences aus dem Geofencing übernommen. Dabei wird eine geografische Region oder ein Geofence definiert und eine App erhält Rückrufe, wenn ein Nutzer den Geofence-Bereich betritt oder verlässt. Die Fence API erweitert das Konzept des Geofencings und umfasst neben der geografischen Nähe viele weitere Kontextbedingungen. Eine App empfängt Callbacks, wenn der Kontextstatus wechselt. Wenn Ihre App beispielsweise einen Grenzwert für Kopfhörer definiert, erhält sie Rückrufe, wenn die Kopfhörer angeschlossen oder getrennt werden.

Mit der Fence API können Sie Begrenzungen basierend auf Kontextsignalen definieren, z. B.:

  • Der aktuelle Standort des Nutzers (Breiten-/Längengrad)
  • Die 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 Begrenzungen mit den booleschen Operatoren AND, OR und NOT zu erstellen. Ihre App erhält dann Callbacks, wenn die Begrenzungsbedingungen erfüllt sind. Beispiele für mögliche Zäune:

  • Der Nutzer schließt Kopfhörer an und beginnt zu laufen.
  • Ein Nutzer betritt an einem Wochentag vor 17:00 Uhr einen 100-Meter-Geofence.
  • Der Nutzer betritt den Bereich eines bestimmten BLE-Beacons.

Das folgende Beispiel zeigt, wie Sie einen Zaun definieren, der aktiviert wird, 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 den Empfang von Callbacks zu registrieren.
  • Definieren Sie einen Rückruf, der aufgerufen werden kann, wenn sich der Zaunstatus ändert.

Das folgende Beispiel zeigt eine Methode, mit der ein Zaun erstellt und registriert wird. 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);
        }
    }
}