Panoramica dell'API Fence

Nell'API Awareness, il concetto di recinti è tratto dal geofencing, in cui viene definita una regione geografica, o recinto virtuale, e un'app riceve 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 prossimità geografica. Un'app riceve callback ogni volta che lo stato del contesto cambia. Ad esempio, se la tua app definisce un recinto virtuale per le cuffie, riceve callback quando le cuffie vengono collegate e quando vengono scollegate.

Puoi utilizzare l'API Fence per definire i recinti virtuali in base a indicatori di contesto, ad esempio:

  • La posizione attuale dell'utente (latitudine/longitudine)
  • L'attività corrente dell'utente, ad esempio se sta camminando o guidando.
  • 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 recinti con gli operatori booleani AND, OR e NOT. L'app riceve quindi i callback ogni volta che vengono soddisfatte le condizioni del recinto virtuale. Alcuni esempi di possibili barriere includono:

  • L'utente collega le cuffie e inizia a camminare.
  • L'utente entra in un recinto virtuale di 100 metri prima delle 17:00 di un giorno feriale.
  • L'utente entra nel raggio d'azione di un beacon BLE specifico.

L'esempio seguente mostra come definire un recinto virtuale che si attiva ogni volta che l'utente cammina:

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

Una volta definito un recinto, devi:

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

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

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