In der Awareness API wird das Konzept der Fences vom Geofencing übernommen. 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 empfängt 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 getrennt werden.
Mit der Fence API können Sie Geofences anhand von 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 Kopfhörer angeschlossen sind.
- Nähe zu Beacons in der Umgebung
Mit der Fence API können Sie mehrere Kontextsignale kombinieren, um Geofences mit den booleschen Operatoren AND, OR und NOT zu erstellen. Ihre App erhält dann Callbacks, wenn die Fence-Bedingungen erfüllt sind. Beispiele für mögliche Zäune:
- Der Nutzer schließt Kopfhörer an und geht los.
- Der Nutzer betritt an einem Wochentag vor 17:00 Uhr einen Geofence von 100 Metern.
- Der Nutzer befindet sich im Bereich eines bestimmten BLE-Beacons.
Im folgenden Beispiel wird ein Fence definiert, der 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 für den Empfang von Callbacks zu registrieren. - Definiere einen Callback, der aufgerufen werden kann, wenn sich der Status des Fence ä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 den 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);
}
}
}