Dans l'API Awareness, le concept de barrière est repris du géorepérage, dans lequel 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 ou quitte la zone de géorepérage. L'API Fence étend le concept de géorepérage pour inclure de nombreuses autres conditions contextuelles 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 lorsqu'ils sont débranchés.
Vous pouvez utiliser l'API Fence pour définir des barrières en fonction de signaux contextuels, comme 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, comme si le casque est branché.
- Proximité avec des balises à proximité
L'API Fence vous permet de combiner plusieurs signaux de contexte pour créer des barrières avec des 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 barrières possibles:
- L'utilisateur branche ses écouteurs et commence à marcher.
- L'utilisateur entre dans une zone de géorepérage de 100 mètres avant 17 h en semaine.
- L'utilisateur se trouve dans la zone de couverture d'un signal 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éfinissez un rappel pouvant ê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);
}
}
}