Przegląd Fence API

W interfejsie API Awareness pojęcie ogrodzeń pochodzi z geofencingu, w którym definiowany jest region geograficzny lub geofence, a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi na ten obszar lub go opuszcza. Interfejs API Fence rozszerza koncepcję geofencingu, aby obejmować wiele innych warunków kontekstowych oprócz bliskości geograficznej. Aplikacja otrzymuje wywołania zwrotne za każdym razem, gdy zmienia się stan kontekstu. Jeśli na przykład aplikacja zdefiniuje ogrodzenie dla słuchawek, będzie otrzymywać wywołania zwrotne, gdy słuchawki zostaną podłączone i odłączone.

Za pomocą interfejsu API Fence możesz definiować ogrodzenia na podstawie sygnałów kontekstowych, takich jak:

  • bieżąca lokalizacja użytkownika (szerokość i długość geograficzna);
  • bieżąca aktywność użytkownika, np. chodzenie lub jazda samochodem;
  • warunki specyficzne dla urządzenia, np. czy słuchawki są podłączone;
  • bliskość beaconów w pobliżu.

Interfejs API Fence umożliwia łączenie wielu sygnałów kontekstowych w celu tworzenia ogrodzeń za pomocą operatorów logicznych AND, OR i NOT. Aplikacja otrzymuje wtedy wywołania zwrotne, gdy zostaną spełnione warunki ogrodzenia. Oto kilka przykładów możliwych ogrodzeń:

  • Użytkownik podłącza słuchawki i zaczyna chodzić.
  • Użytkownik wchodzi na obszar geofence o promieniu 100 metrów przed godziną 17:00 w dzień powszedni.
  • Użytkownik wchodzi w zasięg określonego beacona BLE.

Poniższy przykład pokazuje, jak zdefiniować ogrodzenie, które aktywuje się, gdy użytkownik chodzi:

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

Po zdefiniowaniu ogrodzenia musisz wykonać te czynności:

  • Wywołaj updateFences , aby zarejestrować ogrodzenie i otrzymywać wywołania zwrotne.
  • Zdefiniuj wywołanie zwrotne, które można wywołać, gdy zmieni się stan ogrodzenia.

Poniższy przykład pokazuje metodę, która tworzy i rejestruje ogrodzenie. W tym przykładzie do obsługi intencji po wywołaniu 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);
        }
    }
}