Рядом API, каков правильный способ сканирования маяков в фоновом режиме?

Я изучаю API Google, расположенный рядом с ним для обнаружения маяков (Eddystone). Единственный текущий подход на данный момент, похоже, вызывает Nearby.Messages.subscribe() как описано здесь .

Проблема в том, что это не подходит для непрерывного сканирования в фоновом режиме. Моему приложению нужно следить за сигналами маяков в фоновом режиме, поэтому, если он станет видимым, он выполнит вызов REST API. В принципе, мне нужно что-то похожее на функцию мониторинга маяка, предоставляемую Estimote SDK.

Можно ли достичь этого с помощью API-интерфейса, не разряжающего аккумулятор?

Solutions Collecting From Web of "Рядом API, каков правильный способ сканирования маяков в фоновом режиме?"

Я понимаю, что этот вопрос касается использования API-интерфейса, но я не знаю, как его использовать для удовлетворения ваших требований.

Если вы открыты для альтернатив, бесплатная и открытая база Android Beacon Library имеет полную поддержку маяков Eddystone. Его API моделируется после iOS-мониторинга / управления маяком API, поэтому он будет делать именно то, что вы хотите.

См. Здесь, как использовать эту библиотеку для наблюдения за маяками Eddystone.

Кажется, что единственный способ сделать то, что вы хотите, – либо непрерывно сканировать, либо использовать местоположение устройства и маяка, чтобы запускать сканирование, когда они близки. В любом случае, задействован аккумулятор, поскольку вы либо сканируете, либо разделяете местоположение. Похоже, что маяки Estimote используют подход местоположения, что, вероятно, является лучшим подходом в плане экономии батареи.

Вы можете подписаться также в фоновом режиме, чтобы получать уведомления Intent вместо уведомлений MessageListener. Фоновое сканирование – маломощное сканирование, поэтому латентность может быть очень длинной (даже минуты для обнаружения маяка). Сканирование выполняется при событии на экране или при запросе другого приложения. Таким образом, вы получаете результаты других сканирований приложений.

Вы можете создать GoogleApiClient, используя контекст приложения вместо контекста активности. Вызовите это, т. Е. От широковещательного приемника, реагирующего на широковещательную передачу BOOT_COMPLETED.

 GoogleApiClient client = new GoogleApiClient.Builder(appContext) .addApi(Nearby.MESSAGES_API, new MessagesOptions.Builder() .setPermissions(NearbyPermissions.BLE) .build()) .build(); client.connect(); 

Как только клиент подключен (метод onConnected ConnectionCallbacks), вы можете подписаться с помощью PendingIntent и создать широковещательный приемник, который обрабатывает намерение.

В широковещательном приемнике вы можете обрабатывать намерение, используя метод Near.Messages.handleIntent, который использует тот же MessageListener, что и сканирование переднего плана.

Одной из проблем, связанных с этим подходом, являются разрешения на доступ. Чтобы разрешить пользователю одобрять доступ, вам нужен интерфейс. Моим решением было подождать с фоновым сканированием, пока пользователь впервые не откроет приложение и не примет разрешения. После принятия вы можете подписаться в фоновом режиме.