Мониторинг Android Geofence с режимом определения местоположения только по GPS

Я создаю приложение, которое использует мониторинг Geofence, я успешно реализовал эту функцию, но столкнулся с проблемой при тестировании с настройкой местоположения «Только устройство», которая сама использует GPS.

Я могу получить данные о местоположении только с помощью устройства, но когда я пытаюсь добавить геозоны для мониторинга, он всегда возвращает код состояния 1000, который является GEOFENCE_NOT_AVAILABLE.

Этот код ниже для addGeofences вызывается после того, как я подтвердил разрешения на местоположение

 LocationServices.GeofencingApi.addGeofences(mApiClient, getGeofencingRequest(),
                    mGeofenceRequestIntent).setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(@NonNull Status status) {
                    if(!status.isSuccess()) {
                        Toast.makeText(mContext, String.format("Monitor Geofences %s", status.getStatusCode()), Toast.LENGTH_LONG).show();
                    }
                    else{
                        Toast.makeText(mContext, String.format("Successfully Monitor Geofences %s", status.getStatusCode()), Toast.LENGTH_LONG).show();
                    }
                }
            });

Я делаю что-то не так, или это мой единственный вариант заставить пользователя использовать режим экономии заряда батареи в режимах определения местоположения с высокой точностью?


person Gooner    schedule 07.06.2016    source источник


Ответы (1)


Геозона на основе сервисов Google по умолчанию не запрашивает обновления GPS. Это должно быть «принудительно», после этого ваше приложение должно снова работать, как и ожидалось.

То, как это сработало для меня, заключалось в реализации LocationListener в общедоступном классе в файле активности, который содержит инициализацию GoogleAPIClient, GeofencingRequest и т. д.

Затем в том же открытом классе добавьте в конце

private LocationManager locationManager;

Вслед за этим в конце вашего метода onCreate

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

А также это для onResume («1000» и «5» — скорость обновления в миллисекундах и количество выборок на обновление соответственно)

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 5, this);

И, наконец, добавьте это в onPause, если вы хотите сэкономить заряд батареи, когда приложение не на переднем плане, но, по моему собственному опыту, вы пропустите все уведомления, которые появляются во время этого простоя.

locationManager.removeUpdates(this);

Также не забудьте импортировать все новые пакеты.

Если вы могли получать уведомления (независимо от точности) перед изменением настроек системы и ничего больше не меняли, я полагаю, что это может решить вашу проблему.

Я заметил, что вы упомянули, что вы получаете данные о местоположении с включенной настройкой «Только устройство», но, возможно, только через приложения, такие как Карты, например, которые имеют возможность запрашивать данные GPS у этого провайдера, даже если WI-FI, СОТОВЫЕ ДАННЫЕ или оба отключены . Вы также можете опубликовать дополнительный код, который поможет вам определить проблему.

person klein_gat    schedule 04.07.2016
comment
кстати, прочитав немного одну из ссылок справа, я также понял, что номер ошибки, с которой вы столкнулись, связан с изменением режима местоположения в настройках, поскольку все текущие геозоны перестают регистрироваться, когда это происходит, поэтому, чтобы избежать этого проблема, вам придется использовать определенную логику в своем коде, чтобы компенсировать это изменение, которое к тому времени вы, возможно, уже знаете, но на всякий случай вот оно: stackoverflow.com/questions/19082482 - person klein_gat; 04.07.2016