Не отображаются переходы между геозонами в учебнике Google по геозонам

Я пытаюсь протестировать функциональность Geofence, используя пример Google: создание и мониторинг геозон. Я загрузил код здесь.

Проблема в том, что я никогда не получаю уведомления о входе или выходе. У меня есть Wi-Fi, 4G и GPS. Я пробовал тестировать следующими способами:

  1. Я даже выхожу из дома примерно на 50 футов и захожу обратно, но никаких уведомлений. Я вижу, что игровые сервисы подключаются, и даже "GeofenceUtils.ACTION_GEOFENCES_ADDED in MainActivity.java" срабатывает, поэтому я думаю, что геозоны добавляются правильно.
  2. Включил фиктивные местоположения в настройках и использовал это поддельное приложение GPS и изменил местоположение - начиная с тех же координат, что и Geofence1, а затем устанавливая что-то совершенно за пределами (в другом состоянии) - но я все еще не получаю уведомления о выходе.

Что я делаю неправильно? ЛЮБОЙ успешный запуск этого примера Google: создание и мониторинг геозон. Я загрузил здесь код для удобства просмотра.

Я просто пытаюсь изучить геозону - обнаружение входа и выхода. Я ОТМЕЧУ ЛЮБОЙ ОТВЕТ КАК ПРАВИЛЬНЫЙ ОТВЕТ, КОТОРЫЙ МОЖНО ИСПОЛЬЗОВАТЬ, ЧТОБЫ ГЕОЗОНКА ЗАРАБОТАЛА НА МОЕМ НАСТОЯЩЕМ УСТРОЙСТВЕ

Я ввожу координаты и радиус ниже.


person user1406716    schedule 07.04.2014    source источник
comment
На самом деле в примере кода Android есть ошибка. Вы не должны использовать класс IntentService для уведомления и перехода. Замените его на BroadCastReceiver. Та же проблема опубликована здесь - stackoverflow .com/questions/19505614/   -  person Pankaj    schedule 08.04.2014
comment
Можете ли вы сказать мне, как вы решили эту проблему?   -  person Hunt    schedule 26.06.2014
comment
Я этого не сделал, и поэтому я не отметил ответ ниже как правильный ответ. Мне нужно вернуться к этому в какой-то момент .... извините. Если вы найдете способ, было бы здорово, если бы вы могли опубликовать решение, пожалуйста.   -  person user1406716    schedule 27.06.2014
comment
@ user1406716 Вы решили проблему?   -  person Hunt    schedule 20.07.2014
comment
@Hunt Нет, мне не очень повезло, я, вероятно, вернусь к этому в будущем. Если сделаю, обновлю здесь.   -  person user1406716    schedule 20.07.2014


Ответы (4)


У меня также были проблемы с кодом примера. Одна из основных проблем, с которыми я столкнулся, была связана с объявлением ReceiveTransitionsIntentService. Вам не нужно добавлять BroadcastReceiver или запрашивать обновления местоположения, но вам нужно изменить свой AndroidManifest, чтобы установить для экспортируемого значения значение true, например:

<service
    android:name=".ReceiveTransitionsIntentService"
    android:exported="true" >
</service>

Убедитесь, что путь к сервису также указан правильно.

Я значительно упростил пример Google, и вы можете найти код и объяснение здесь. Я удалил компонент пользовательского интерфейса и постоянное хранилище Geofence, поэтому этому примеру будет легче следовать. Надеюсь это поможет!

person mari    schedule 08.08.2014
comment
Эй, ваш блог действительно полезен, спасибо. Однако я думаю, что там есть ошибка - в разделе манифеста указано <service .. android:exported="false". Я думаю, вы имеете в виду true. Спасибо! - person Steven; 14.09.2014
comment
Большое спасибо за сообщение в блоге! - person Oliver Hoffman; 16.09.2014
comment
@mari Я не понимаю, что может быть по-другому ?? Я имею в виду, я пробовал это и не играл в кости. - person IgorGanapolsky; 27.01.2015
comment
Это хороший ответ... создание android:exported=true устранило проблему - person thilina c; 16.03.2016
comment
Я согласен с другим сообщением. Это правильный ответ. Android Studio ставит android:exported="false" при создании IntentService. Вы должны зайти в манифест и изменить его на true. Этот ответ должен быть помечен как решение. - person Michel; 30.10.2017
comment
Блестящий. Большое спасибо @mari - person prijupaul; 10.01.2018

Изначально мой код работал плавно, но после этого у меня тоже возникла эта проблема. Попробуйте это, изменив класс geofenceRequester в функции continueAddGeofences(). в основном это вызов приемника через метод запроса местоположения

 private void continueAddGeofences() {


            // Get a PendingIntent that Location Services issues when a geofence
            // transition occurs
            mGeofencePendingIntent = createRequestPendingIntent();

            // Send a request to add the current geofences
            mLocationClient.addGeofences(mCurrentGeofences, mGeofencePendingIntent,
                    this);
            //mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

            try {
                LocationRequest locationrequest = LocationRequest.create();
                locationrequest.setPriority(locationrequest.PRIORITY_HIGH_ACCURACY);
                 locationrequest.setInterval(3000);


                mLocationClient.requestLocationUpdates(locationrequest, mGeofencePendingIntent);
            } catch (Exception e) {
                e.printStackTrace();
            }
person Priya    schedule 07.04.2014
comment
Я получил уведомление один раз, но не смог получить его снова. Как вы тестируете свое приложение? Вы используете приложение для имитации местоположения или действительно уходите от координат геозоны? Как далеко ты уходишь? - person user1406716; 07.04.2014
comment
Я на самом деле ухожу от координат геозоны, и уход зависит от радиуса, который вы указали, я дал радиус 10 м. - person Priya; 08.04.2014
comment
Вам подойдет радиус 5м или 10м? и когда вы входите и выходите - вы видите отдельные уведомления, показывающие вход и выход???? - person user1406716; 08.04.2014
comment
нет, уведомления заменяют существующие зависимости при входе или выходе - person Priya; 08.04.2014
comment
@SpunkyPriya мне нужно что-то изменить в BroadcastReceiver? - person Hunt; 26.06.2014
comment
Как вы это тестируете — на Genymotion или на реальном устройстве? Я не получаю никаких результатов... - person IgorGanapolsky; 27.01.2015
comment
на реальном устройстве @IgorGanapolsky - person Priya; 01.04.2015

У меня также была такая же проблема с API-интерфейсом Geofence. В конце я использовал addProximityAlert из LocationManager. Это сработало очень хорошо!

person Eric    schedule 06.11.2015

Как видите, Google переработал логику определения местоположения, это новый API. Кажется, он работает как «общий» поставщик местоположения (LocationRequest#setFastestInterval может предоставить вам координаты, если какое-либо другое приложение запрашивает его, или вы можете получить координаты с помощью PRIORITY_NO_POWER flag).

Geofence API похож на метод helper, вам не нужно разрабатывать подобную логику (расчет радиуса и т.д.). Но Geofence не запрашивает координаты сама по себе, а просто использует полученные координаты (т.е. из другого приложения). Именование методов говорит само за себя: LocationServices.GeofencingApi.addGeofences; => addGeofences, а не requestGeofences.

Итак, вы должны запросить координаты, используя:

LocationServices.FusedLocationApi.requestLocationUpdates
person Niobij    schedule 16.06.2015
comment
Это неверно, вам не нужно запрашиватьLocationUpdates, чтобы система отправляла вам намерения геозоны. - person akent; 22.10.2015
comment
@akent, если я не запрашиваю обновления местоположения, я не получаю намерения геозоны от системы, но если я открою любое приложение, запрашивающее местоположение (например, карту), или просто включу обновления местоположения из своего приложения, оно начнет срабатывать. Вы уверены в том, что сказали? как вы заставили это работать? - person Juan Saravia; 03.03.2017