Koncepcja ogrodzeń pochodzi z geofencingu, w którym zdefiniowany jest region geograficzny (geofence), a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi do regionu geofencingu lub go opuszcza. Fence API rozszerza koncepcję geofencingu, aby uwzględnić wiele innych warunków kontekstowych w odległości geograficznej. Aplikacja otrzymuje wywołania zwrotne za każdym razem, gdy następuje zmiana stanu. Jeśli aplikacja określa na przykład ogrodzenie dla słuchawek, są one wywoływane po podłączeniu słuchawek i po ich odłączeniu.
Za pomocą interfejsu Fence API możesz określić ogrodzenia na podstawie sygnałów kontekstowych, na przykład:
- Aktualna lokalizacja użytkownika (szerokość lub długość geograficzna)
- Obecna aktywność użytkownika, np. chodzenie lub jazda samochodem.
- W zależności od urządzenia (np. czy słuchawki są podłączone).
- Odległość od beaconów w pobliżu
Interfejs Fence API umożliwia połączenie wielu sygnałów kontekstowych w celu utworzenia ogrodzeń z operatorami logicznymi AND
, OR
i NOT
. Aplikacja odbiera wywołania zwrotne zawsze wtedy, gdy spełnione są warunki ogrodzenia. Oto kilka przykładów płotów:
- Użytkownik podłącza słuchawki i rozpoczyna chodzenie.
- Użytkownik włączasz w geotagu 100-metrowy geofencing przed dniem 17:00.
- Użytkownik wpisuje zakres konkretnego obrazu typu BLE.
Poniższy przykład pokazuje, jak zdefiniować płot, który aktywuje się podczas każdego spaceru:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
Po skonfigurowaniu ogrodzenia musisz wykonać te czynności:
- Aby zarejestrować wywołania zwrotne, zadzwoń pod numer
updateFences
. - Określ wywołanie zwrotne, które może zostać wywołane, gdy zmieni się stan ogrodzenia.
Poniższy przykład pokazuje metodę tworzenia i rejestrowania ogrodzenia. W tym przykładzie do wyświetlenia intencji po uruchomieniu ogrodzenia używana jest niestandardowa podklasa BroadcastReceiver
.
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);
}
}
}