In der Awareness API stammt das Konzept der Fences (Zäune) aus dem Geofencing. Dabei wird eine geografische Region oder ein Geofence (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 Kontextstatus ä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 wie den folgenden definieren:
- Der aktuelle Standort des Nutzers (Breitengrad/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 Fences mit den booleschen Operatoren AND, OR und NOT zu erstellen. Ihre App erhält dann Callbacks, wenn die Zaunbedingungen erfüllt sind. Einige Beispiele für mögliche Zäune:
- Der Nutzer schließt Kopfhörer an und beginnt zu gehen.
- Ein Nutzer betritt an einem Wochentag vor 17:00 Uhr einen 100 Meter großen Geofence.
- Der Nutzer betritt den Bereich eines bestimmten BLE-Beacons.
Im folgenden Beispiel wird gezeigt, wie ein Fence definiert wird, 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
updateFencesauf, um den Fence zu registrieren und Callbacks zu erhalten. - Definieren Sie einen Callback, der aufgerufen werden kann, wenn sich der Zaunstatus ändert.
Im folgenden Beispiel wird eine Methode gezeigt, mit der ein Fence erstellt und registriert wird. In diesem Beispiel wird eine benutzerdefinierte Unterklasse von BroadcastReceiver verwendet, um die Absicht 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);
}
}
}