Panoramica dell'API Fence

Nell'API Awareness, il concetto di recinti è ripreso dal recinto virtuale, in cui viene definita una regione geografica o un recinto virtuale e un'app riceve callback quando un utente entra o esce dalla regione del recinto virtuale. L'API Fence espande il concetto di recinzione virtuale per includere molte altre condizioni di contesto oltre alla vicinanza geografica. Un'app riceve i callback ogni volta che lo stato del contesto cambia. Ad esempio, se la tua app definisce un recinto per le cuffie, riceve i callback quando le cuffie sono collegate e quando vengono 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 a beacon nelle vicinanze

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

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

L'esempio seguente mostra come definire una recinzione 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 in modo che riceva i rilanci.
  • 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 di BroadcastReceiver per gestire l'intento quando viene attivato il recinto virtuale.

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