Nell'API Awareness, il concetto di recinti è tratto dal geofencing, in cui viene definita una regione geografica, o geofence, e un'app riceve callback quando un utente entra o esce dalla regione del geofence. L'API Fence espande 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 i recinti in base ai segnali di contesto, ad esempio:
- La posizione attuale dell'utente (latitudine/longitudine)
- L'attività attuale dell'utente, ad esempio se sta camminando o guidando.
- Condizioni specifiche del dispositivo, ad esempio se le cuffie sono collegate.
- Prossimità ai beacon nelle vicinanze
L'API Fence ti consente di combinare più
segnali di contesto
per creare recinti con gli operatori booleani AND, OR, e NOT. La tua app riceve quindi callback ogni volta che vengono soddisfatte le condizioni del recinto. Ecco alcuni esempi di recinti possibili:
- L'utente collega le cuffie e inizia a camminare.
- L'utente entra in un geofence di 100 metri prima delle 17:00 di un giorno feriale.
- L'utente entra nel 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);
Dopo aver definito un recinto, devi:
- Chiama
updateFencesper registrare il recinto per ricevere callback. - Definisci un callback che può essere richiamato quando lo stato del recinto cambia.
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'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);
}
}
}