Descripción general de la API de cerca

En la API de Awareness, el concepto de vallados se toma del geovallado, en el que se define una región geográfica o geovallado, y una app recibe devoluciones de llamada cuando un usuario entra o sale de la región del geovallado. 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 un perímetro para auriculares, recibe devoluciones de llamada cuando los auriculares están conectados y cuando están desconectados.

Puedes usar la API de Fence para definir cercas basadas en 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 si los auriculares están conectados
  • Proximidad a píxeles contadores cercanos

La API de Fence te permite combinar varios indicadores de contexto para crear cercas con operadores booleanos AND, OR y NOT. Luego, tu app recibe devoluciones de llamada cada vez que se cumplen las condiciones del perímetro. Estos son algunos ejemplos de posibles cercas:

  • 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 la semana.
  • El usuario ingresa al rango de un píxel contador BLE específico.

En el siguiente ejemplo, se muestra cómo definir un perímetro que se activa cada vez que el usuario camina:

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

Una vez que hayas definido un perímetro, debes hacer lo siguiente:

  • Llama a updateFences para registrar el perímetro y recibir devoluciones de llamada.
  • Define una devolución de llamada que se pueda invocar cuando cambie el estado de la cerca.

En el siguiente ejemplo, se muestra un método que crea y registra un perímetro. En este ejemplo, se usa una subclase personalizada de BroadcastReceiver para controlar el intent cuando se activa la cerca.

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