W Awareness API koncepcja ogrodzeń pochodzi z geofencingu, w którym definiuje się region geograficzny lub geofence, a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi na dany obszar lub go opuszcza. Interfejs Fence API rozszerza koncepcję geofencingu, uwzględniając wiele innych warunków kontekstowych oprócz bliskości geograficznej. Aplikacja otrzymuje wywołania zwrotne za każdym razem, gdy zmienia się stan kontekstu. Jeśli na przykład aplikacja definiuje ogrodzenie dla słuchawek, otrzymuje wywołania zwrotne, gdy słuchawki są podłączone i gdy są odłączone.
Możesz użyć interfejsu Fence API, aby zdefiniować granice na podstawie sygnałów kontekstowych, takich jak:
- bieżąca lokalizacja użytkownika (szerokość/długość geograficzna);
- bieżąca aktywność użytkownika, np. chodzenie lub jazda samochodem;
- warunki dotyczące urządzenia, np. czy słuchawki są podłączone;
- odległość od pobliskich sygnałów nawigacyjnych,
Interfejs Fence API umożliwia łączenie wielu sygnałów kontekstowych w celu tworzenia ogrodzeń za pomocą operatorów logicznych AND, OR i NOT. Aplikacja otrzymuje wywołania zwrotne, gdy zostaną spełnione warunki ogrodzenia. Oto kilka przykładów możliwych ogrodzeń:
- Użytkownik podłącza słuchawki i zaczyna iść.
- Użytkownik wchodzi w obszar geofence o promieniu 100 metrów przed godziną 17:00 w dzień powszedni.
- Użytkownik wchodzi w zasięg określonej wyszukiwarki BLE.
Poniższy przykład pokazuje, jak zdefiniować ogrodzenie, które aktywuje się, gdy użytkownik idzie:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
Po zdefiniowaniu ogrodzenia musisz wykonać te czynności:
- Zadzwoń pod numer
updateFences, aby zarejestrować ogrodzenie i otrzymywać połączenia zwrotne. - Zdefiniuj wywołanie zwrotne, które może zostać wywołane, gdy zmieni się stan ogrodzenia.
W przykładzie poniżej pokazujemy metodę, która tworzy i rejestruje ogrodzenie. W tym przykładzie do obsługi intencji po aktywowaniu 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);
}
}
}