Présentation de l'API Fence

Dans l'API Awareness, le concept de barrières est issu de la zone de géorepérage, dans laquelle une région géographique (ou zone de géorepérage) est définie, et une application reçoit des rappels lorsqu'un utilisateur entre dans la zone ou en quitte. L'API Fence s'appuie sur le concept de géorepérage pour inclure de nombreuses autres conditions de contexte en plus de la proximité géographique. Une application reçoit des rappels chaque fois que l'état du contexte change. Par exemple, si votre application définit une clôture pour casque, elle reçoit des rappels lorsque le casque est branché et lorsqu'il est débranché.

L'API Fence permet de définir des clôtures en fonction des signaux de contexte, par exemple:

  • Position actuelle de l'utilisateur (latitude/longitude)
  • Activité en cours de l'utilisateur (par exemple, marche ou conduite)
  • Conditions spécifiques à l'appareil, telles que le fait de brancher le casque ou non.
  • Proximité avec des balises à proximité

L'API Fence vous permet de combiner plusieurs signaux de contexte pour créer des clôtures avec des opérateurs booléens AND, OR et NOT. Votre application reçoit ensuite des rappels chaque fois que les conditions de clôture sont remplies. Voici quelques exemples de clôtures possibles:

  • L'utilisateur branche un casque audio et commence à marcher.
  • L'utilisateur entre dans une zone de géorepérage de 100 mètres avant 17 heures un jour de semaine.
  • L'utilisateur entre dans la plage d'une balise BLE spécifique.

L'exemple suivant montre comment définir une clôture qui s'active chaque fois que l'utilisateur marche:

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

Une fois que vous avez défini une clôture, procédez comme suit:

  • Appelez updateFences pour enregistrer la clôture afin de recevoir des rappels.
  • Définir un rappel qui peut être appelé lorsque l'état de la clôture change.

L'exemple suivant montre une méthode qui crée et enregistre une clôture. Dans cet exemple, une sous-classe personnalisée de BroadcastReceiver est utilisée pour gérer l'intent lorsque la clôture est déclenchée.

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