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