Panoramica dell'API Fence

Nell'API Awareness, il concetto di recinzioni viene preso dal geofencing, in cui è definita un'area geografica, o geofence, e un'app riceve i callback quando un utente entra o esce dalla regione del recinto virtuale. L'API Fence amplia il concetto di geofencing per includere molte altre condizioni di contesto oltre alla vicinanza geografica. Un'app riceve callback ogni volta che lo stato esegue la transizione. Ad esempio, se la tua app definisce un recinto per le cuffie, viene richiamata quando le cuffie sono collegate e quando sono scollegate.

Puoi utilizzare l'API Fence per definire recinti in base a indicatori di contesto, come i seguenti:

  • La posizione corrente dell'utente (latitudine/longitudine)
  • L'attività corrente dell'utente, ad esempio a piedi o in auto.
  • Condizioni specifiche del dispositivo, ad esempio se le cuffie sono collegate.
  • Vicinanza ai beacon nelle vicinanze

L'API Fence ti consente di combinare più indicatori di contesto per creare recinzioni con gli operatori booleani AND, OR e NOT. L'app riceve quindi i callback ogni volta che vengono soddisfatte le condizioni del recinto. Alcuni esempi di possibili recinzioni includono:

  • L'utente si collega alle cuffie e inizia a camminare.
  • L'utente accede a un recinto virtuale di 100 metri prima delle 17:00 di un giorno feriale.
  • L'utente inserisce un intervallo di beacon BLE specifici.

L'esempio seguente mostra come definire una recinzione che si attiva ogni volta che l'utente cammina:

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

Dopo aver definito una recinzione, devi:

  • Chiama il numero updateFences per registrare il recinto per ricevere i callback.
  • Definisci un callback che può essere richiamato quando cambia lo stato del recinto.

L'esempio seguente mostra un metodo che crea e registra un recinto. In questo esempio, viene utilizzata una sottoclasse personalizzata BroadcastReceiver per gestire l'intent quando viene attivata la recinzione.

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