Ogrodzeniowy interfejs API – omówienie

Koncepcja ogrodzeń pochodzi z geofencingu, w którym zdefiniowany jest region geograficzny (geofence), a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi do regionu geofencingu lub go opuszcza. Fence API rozszerza koncepcję geofencingu, aby uwzględnić wiele innych warunków kontekstowych w odległości geograficznej. Aplikacja otrzymuje wywołania zwrotne za każdym razem, gdy następuje zmiana stanu. Jeśli aplikacja określa na przykład ogrodzenie dla słuchawek, są one wywoływane po podłączeniu słuchawek i po ich odłączeniu.

Za pomocą interfejsu Fence API możesz określić ogrodzenia na podstawie sygnałów kontekstowych, na przykład:

  • Aktualna lokalizacja użytkownika (szerokość lub długość geograficzna)
  • Obecna aktywność użytkownika, np. chodzenie lub jazda samochodem.
  • W zależności od urządzenia (np. czy słuchawki są podłączone).
  • Odległość od beaconów w pobliżu

Interfejs Fence API umożliwia połączenie wielu sygnałów kontekstowych w celu utworzenia ogrodzeń z operatorami logicznymi AND, OR i NOT. Aplikacja odbiera wywołania zwrotne zawsze wtedy, gdy spełnione są warunki ogrodzenia. Oto kilka przykładów płotów:

  • Użytkownik podłącza słuchawki i rozpoczyna chodzenie.
  • Użytkownik włączasz w geotagu 100-metrowy geofencing przed dniem 17:00.
  • Użytkownik wpisuje zakres konkretnego obrazu typu BLE.

Poniższy przykład pokazuje, jak zdefiniować płot, który aktywuje się podczas każdego spaceru:

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

Po skonfigurowaniu ogrodzenia musisz wykonać te czynności:

  • Aby zarejestrować wywołania zwrotne, zadzwoń pod numer updateFences.
  • Określ wywołanie zwrotne, które może zostać wywołane, gdy zmieni się stan ogrodzenia.

Poniższy przykład pokazuje metodę tworzenia i rejestrowania ogrodzenia. W tym przykładzie do wyświetlenia intencji po uruchomieniu ogrodzenia używana jest niestandardowa podklasa BroadcastReceiver.

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