W interfejsie API Awareness pojęcie obszarów pochodzi z geofencingu, w którym definiowany jest region geograficzny lub geofence, a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi na ten obszar lub go opuszcza. Interfejs API Fence rozszerza koncepcję geofencingu o wiele innych warunków dostępu zależnego od kontekstu 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 zdefiniuje obszar dla słuchawek, będzie otrzymywać wywołania zwrotne, gdy słuchawki zostaną podłączone i odłączone.
Za pomocą interfejsu API Fence możesz definiować obszary na podstawie sygnałów kontekstowych, takich jak:
- bieżąca lokalizacja użytkownika (szerokość i długość geograficzna);
- bieżąca aktywność użytkownika, np. chodzenie lub jazda samochodem;
- warunki specyficzne dla urządzenia, np. czy słuchawki są podłączone;
- bliskość pobliskich beaconów.
Interfejs API Fence umożliwia łączenie wielu
sygnałów kontekstowych
w celu tworzenia obszarów za pomocą operatorów logicznych AND, OR i NOT. Aplikacja otrzymuje wtedy wywołania zwrotne, gdy zostaną spełnione warunki obszaru. Oto kilka przykładów możliwych obszarów:
- Użytkownik podłącza słuchawki i zaczyna chodzić.
- Użytkownik wchodzi na obszar o promieniu 100 metrów przed godziną 17:00 w dzień powszedni.
- Użytkownik wchodzi w zasięg określonego beacona BLE.
Poniższy przykład pokazuje, jak zdefiniować obszar, który aktywuje się, gdy użytkownik chodzi:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
Po zdefiniowaniu obszaru musisz wykonać te czynności:
- Wywołaj
updateFences, aby zarejestrować obszar i otrzymywać wywołania zwrotne. - Zdefiniuj wywołanie zwrotne, które można wywołać, gdy zmieni się stan obszaru.
Poniższy przykład pokazuje metodę, która tworzy i rejestruje obszar. W tym przykładzie do obsługi intencji po wywołaniu obszaru 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);
}
}
}