Descripción general de la API de Fence

En la API de reconocimiento, el concepto de cercas se toma del geovallado, en el que se define una región geográfica, o geovalla, y una app recibe devoluciones de llamada cuando un usuario entra a la región de geovallas o la abandona. La API de Fence se expande en el concepto de geovallado para incluir muchas otras condiciones contextuales además de la proximidad geográfica. Una app recibe devoluciones de llamada cada vez que el estado del contexto cambia. Por ejemplo, si tu app define una valla para auriculares, recibe devoluciones de llamada cuando los auriculares están conectados y cuando están desconectados.

Puedes usar la API de límites para definir vallas en función de los indicadores de contexto, como los siguientes:

  • La ubicación actual del usuario (latitud/longitud)
  • La actividad actual del usuario, como caminar o conducir
  • Condiciones específicas del dispositivo, como el hecho de que los auriculares estén conectados
  • Proximidad a balizas cercanas

La API de Fence te permite combinar varios indicadores de contexto para crear vallas con operadores booleanos AND, OR y NOT. Luego, tu app recibirá devoluciones de llamada cada vez que se cumplan las condiciones de valla. Estos son algunos ejemplos de cercas posibles:

  • El usuario conecta los auriculares y comienza a caminar.
  • El usuario ingresa a un geovallado de 100 metros antes de las 5 p.m. los días de semana.
  • El usuario ingresa un rango de una baliza BLE específica.

En el siguiente ejemplo, se muestra cómo definir una valla que se active cada vez que el usuario camine:

AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING);

Una vez que hayas definido una valla, debes hacer lo siguiente:

  • Llama a updateFences para registrar la valla a fin de 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 valla. En este ejemplo, se usa una subclase personalizada de BroadcastReceiver para controlar el intent cuando se activa la valla.

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);
        }
    }
}