Présentation de l'API Fence

Dans l'API Awareness, le concept de clôtures est tiré du géorepérage, dans lequel une région géographique, ou géorepère, est définie, et une application reçoit des rappels lorsqu'un utilisateur entre dans la région du géorepère ou en sort. L'API Fence étend 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 les écouteurs, elle reçoit des rappels lorsque les écouteurs sont branchés et débranchés.

Vous pouvez utiliser l'API Fence pour définir des clôtures basées sur des signaux contextuels, tels que les suivants :

  • Position actuelle de l'utilisateur (latitude/longitude)
  • Activité actuelle de l'utilisateur, comme la marche ou la conduite.
  • Conditions spécifiques à l'appareil, par exemple si le casque est branché.
  • Proximité avec les balises à proximité

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

  • L'utilisateur branche un casque et commence à marcher.
  • L'utilisateur entre dans une zone géographique de 100 mètres avant 17h en semaine.
  • L'utilisateur entre dans le rayon 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, vous devez effectuer les opérations suivantes :

  • Appelez updateFences pour enregistrer la clôture et recevoir des rappels.
  • Définissez un rappel qui peut être invoqué 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);
        }
    }
}