Обзор API забора

В API Awareness концепция ограждений заимствована из концепции геозонирования (geofencing) , где определяется географический регион ( geofence ), и приложение получает обратные вызовы, когда пользователь входит в геозону или покидает её. API Fence расширяет концепцию геозонирования, включая множество других контекстных условий, помимо географической близости. Приложение получает обратные вызовы при каждом изменении состояния контекста. Например, если ваше приложение определяет ограждение для наушников, оно получает обратные вызовы при их подключении и отключении.

API Fence можно использовать для определения ограждений на основе контекстных сигналов, например:

  • Текущее местоположение пользователя (широта/долгота)
  • Текущая активность пользователя, например ходьба или вождение.
  • Условия, специфичные для устройства, например, подключены ли наушники.
  • Близость к ближайшим маякам

API Fence позволяет комбинировать несколько контекстных сигналов для создания границ с помощью логических операторов AND , OR и NOT . Ваше приложение будет получать обратные вызовы при выполнении условий границ. Вот некоторые примеры возможных границ:

  • Пользователь подключает наушники и начинает идти.
  • Пользователь въезжает в 100-метровую геозону до 17:00 в будний день.
  • Пользователь вводит радиус действия определенного маяка BLE.

В следующем примере показано, как определить ограждение, которое активируется всякий раз, когда пользователь идет:

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

После того как вы определили ограждение, необходимо сделать следующее:

  • Позвоните в updateFences , чтобы зарегистрировать ограждение для получения обратных вызовов.
  • Определите обратный вызов, который может быть вызван при изменении состояния ограждения.

В следующем примере показан метод, создающий и регистрирующий барьер. В этом примере пользовательский подкласс 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);
        }
    }
}