Panoramica dell'API Fence

Nell'API Awareness, il concetto di recinti deriva 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 per le cuffie, riceve callback quando le cuffie sono collegate e quando sono scollegate.

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

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

L'API Fence consente di combinare più indicatori contestuali per creare recinti con operatori booleani AND, OR e NOT. La tua app riceve callback ogni volta che le condizioni del recinto vengono soddisfatte. Alcuni esempi di possibili recinzioni 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 inserisce il raggio di un beacon BLE specifico.

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

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

Una volta definita una recinzione, devi:

  • Chiama il numero updateFences per registrare la recinzione e ricevere richiami.
  • Definisci un callback che può essere richiamato quando lo stato della recinzione cambia.

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

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