Przegląd Fence API

W interfejsie API Awareness pojęcie obszarów pochodzi z geofencingu, w którym definiuje się region geograficzny lub geofence, a aplikacja otrzymuje wywołania zwrotne, gdy użytkownik wchodzi do tego regionu lub go opuszcza. Interfejs API Fence rozszerza koncepcję geofencingu, aby obejmować wiele innych warunków dostępu zależnego od kontekstu 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 definiuje obszar dla słuchawek, otrzymuje wywołania zwrotne, gdy słuchawki są podłączone i gdy są odłączone.

Za pomocą interfejsu API Fence możesz definiować obszary 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ść pobliskich beaconów.

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

  • Użytkownik podłącza słuchawki i zaczyna chodzić.
  • Użytkownik wchodzi do 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ć obszar, który aktywuje się, gdy użytkownik chodzi:

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

Po zdefiniowaniu obszaru musisz wykonać te czynności:

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

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