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