En la API de Awareness, el concepto de perímetros se toma del geovallado, en el que se define una región geográfica o un perímetro virtual, y una app recibe devoluciones de llamada cuando un usuario ingresa a la región del perímetro virtual o sale de ella. La API de Fence amplía el concepto de geovallado para incluir muchas otras condiciones de contexto, además de la proximidad geográfica. Una app recibe devoluciones de llamada cada vez que cambia el estado del contexto. Por ejemplo, si tu app define una valla para auriculares, recibe devoluciones de llamada cuando se conectan y desconectan los auriculares.
Puedes usar la API de Fence para definir geovallas según los indicadores de contexto, como los siguientes:
- La ubicación actual del usuario (latitud y longitud)
- La actividad actual del usuario, como caminar o conducir
- Condiciones específicas del dispositivo, como si los auriculares están conectados
- Proximidad a balizas cercanas
La API de Fence te permite combinar varias indicaciones de contexto para crear geovallas con operadores booleanos AND, OR y NOT. Luego, tu app recibe devoluciones de llamada cada vez que se cumplen las condiciones de la valla. Estos son algunos ejemplos de posibles vallas:
- El usuario conecta los auriculares y comienza a caminar.
- El usuario ingresa a una geovalla de 100 metros antes de las 5 p.m. en un día de semana.
- El usuario ingresa al rango de una baliza BLE específica.
En el siguiente ejemplo, se muestra cómo definir una geovalla que se activa cada vez que el usuario camina:
AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);
Una vez que hayas definido una cerca, debes hacer lo siguiente:
- Llama a
updateFencespara registrar la geovalla y recibir devoluciones de llamada. - Define una devolución de llamada que se pueda invocar cuando cambie el estado de la valla.
En el siguiente ejemplo, se muestra un método que crea y registra una geovalla. En este ejemplo, se usa una subclase personalizada de BroadcastReceiver para controlar el intent cuando se activa la geovalla.
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);
}
}
}