Обратный вызов OnLocationChanged никогда не вызывается
Я пытаюсь узнать текущее местоположение пользователей с помощью LocationManager . Я провел много исследований и не могу найти никого с такой же проблемой. Обратный вызов OnLocationChanged , кажется, никогда не вызывается. Ниже мой код и файл logcat.
Мой OnCreate() метод
Мой registerLocationUpdates метод
Мои разрешения в AndroidManifest
И, наконец, логарифм после запуска приложения
И части местоположения пакета SDK для Android в logcat продолжают повторяться сами по себе. Я перепробовал все, что мог придумать, и видел в Google и stackoverflow. Также в качестве примечания я смог заставить его работать на устройстве 2.3, используя requestSingleUpdate , который доступен в API 9, и следуя руководству Подробное описание местоположения, но мне нужно, чтобы он работал на версии 2.1 или 2.2 и выше с использованием старого SDK. Итак, если у вас есть какие-либо подсказки или вы хотите узнать больше, дайте мне знать. Заранее спасибо.
15 ответов
Похоже, ваша настройка должна работать, поскольку это не так, я бы сделал ваш пример как можно более простым, чтобы устранить неполадки. Я бы сделал так, чтобы ваш запрос выглядел так
Таким образом, вы получите ВСЕ возможные обновления. И закомментируйте часть о получении последнего известного местоположения. Пока это не нужно.
Тогда в onLocationChanged() просто оставьте
Закомментируйте остальное, чтобы ваш слушатель оставался активным. Это должно дать вам поток обновлений на реальном устройстве. В эмуляторе вам нужно использовать DDMS, и вы будете получать одно обновление GPS каждый раз, когда нажимаете кнопку «Отправить».
В моем случае даже после написания правильного кода я не получил местоположение с помощью client.requestLocationUpdates(locationRequest, this, it) . В телефоне GPS также был включен с помощью
Потратив время на переключение эмуляторов, сборок и т. Д., Наконец выяснилось, что режим определения местоположения был «Только устройство», и он не давал результата на эмуляторе. Переключился на «Высокая точность» и заработал.
Это случилось со мной, когда локацию отключили. Не разрешение местоположения для приложения, а местоположение самого устройства Android. Запрос, чтобы пользователь активировал GPS, исправил это для меня:
Вам также может потребоваться выключить и снова включить GPS, чтобы вызвать диалоговое окно для повышения точности определения местоположения:
Это должно происходить из-за настроек вашего телефона. В настройках местоположения телефонов, если для режима службы определения местоположения установлено значение «Только GPS», функция обратного вызова OnLocationChanged вызывает функцию «Исправление GPS». При выборе параметров «Использовать GPS», «WI-FI и мобильные сети» местоположение будет определяться с использованием этих трех провайдеров. Это займет меньше времени, чтобы определить местоположение вашего устройства. *** Путь к доступу к службам определения местоположения может быть изменен с устройства на устройство. Спасибо
У меня 2 устройства: Samsung Galaxy S4 (Android 5.0.1) и Vertex Win (Android 8.1).
На Самсунге все работает правильно и быстро, координаты GPS определяются, вызывается onLocationChanged .
В Vertex в приоритете PRIORITY_BALANCED_POWER_ACCURACY он, вероятно, сначала взаимодействует с сетевым провайдером, поэтому он находит координаты через Wi-Fi. Но он не может правильно определить, включена ли служба определения местоположения (через некоторое время устройство думает, что оно включено, пока оно выключено, и вызывает метод addOnSuccessListener для LocationServices.getSettingsClient . Поэтому я переключился на PRIORITY_HIGH_ACCURACY и получил еще один сюрприз. Сетевой провайдер отключился, но onLocationChanged не был вызван, поэтому я не смог получить координаты. Я скачал GPS tester (как посоветовал @ Li3ro) из Play Market и увидел, что спутники видны, но без фиксированного сигнала Я не мог принимать сигнал внутри здания.
Даже автономные карты не могли получать координаты, а вот открытые — могли. Итак, после того, как я ушел, я смог найти свои координаты в приложении.
См. Также https://stackoverflow.com/a/27828929/2914140, где говорится о приоритетах и распознавании ошибок ( отключение GPS через некоторое время, если координаты не найдены).
Как ответил Phan Van Linh , вероятно, это потому, что вы находитесь внутри здания. Здесь есть объяснение о том, как имитировать GPS для эмулятора. Кроме того, существует приложение this, которое издевается над Данные GPS.
У меня была такая же проблема (onLocationChanged () никогда не вызывалась с помощью NETWORK_PROVIDER) на моем реальном устройстве (M, targetSDK 23 приложения), пока я не перезапустил его.
Если вы пытаетесь использовать NETWORK_PROVIDER, действительно сложно протестировать:
- на эмуляторе: никогда не работай
- на реальном устройстве: работает только getLastKnownLocation (), чтобы получить onLocationChanged (), вы должны использовать мобильные данные и выйти на улицу с риском потерять телефон от грабителя: P
Я предполагаю, что причина в том, что это просто местоположение сетевого провайдера, а не само ваше устройство, и сетевой провайдер никогда не перемещается, поэтому onLocationChanged () никогда не вызывается. Это может произойти только при переключении между мобильными данными и Wi-Fi и наоборот. Пожалуйста, поправьте меня, если я ошибаюсь.
Поэтому я предлагаю использовать GPS_PROVIDER, чтобы поэкспериментировать, прежде чем рассматривать производительность и использование батареи. Он отлично работает как на эмуляторах, так и на реальных устройствах. Лучшая практика: https://developer.android.com/guide/topics. /location/strategies.html
Мне потребовалось несколько часов, чтобы протестировать NETWORK_PROVIDER без каких-либо результатов, поэтому, надеюсь, мое предложение будет полезным.
Я столкнулся с той же проблемой. Я получал getLastKnownLocation как null. Проблема устранена, когда я перезапустил и устройство, и службу определения местоположения на устройстве.
Источник
OnLocationChanged не вызывается на некоторых устройствах
Это вопрос, который задавался много раз, но я не мог найти решение, которое всегда срабатывает.
Я разрабатываю приложение, используя провайдера Fused location. В onConnected() я запрашиваю обновления местоположения, и логика приложения будет инициирована после создания исправления местоположения и onLocationChanged() . (См. Мой код ниже).
Проблема onLocationChanged() никогда не вызывается на некоторых устройствах. Я использую Samsung Tab 2 и Samsung Galaxy Grand для тестирования. Этот код отлично работает на вкладке 2, но не работает на Grand. Не работает, я имею в виду, что locationClient подключается, но onLocationChanged() никогда не вызывается.
Раньше я использовал диспетчер местоположений для получения местоположения и в этой реализации, возникла одна и та же проблема. Таким образом, я попытался реализовать провайдера плавного доступа, но у меня все еще есть та же проблема.
Может ли кто-нибудь помочь мне решить эту проблему? Что-то мне здесь не хватает?
Я наблюдал такое же поведение на Galaxy Nexus и узнал две вещи, вызывающие onLocationChanged() чтобы их не вызывали. Есть
Соответствующий источник местоположения не включен в системных настройках. Для PRIORITY_HIGH_ACCURACY необходимо включить GPS-спутники , чтобы PRIORITY_BALANCED_POWER_ACCURACY должно быть включено Wi-Fi и местоположение мобильной сети .
Даже для источников с включенным местоположением не может быть действительной информации о местоположении. Например, источник PRIORITY_HIGH_ACCURACY включен, но нет (или не хорошего) приема GPS (например, устройство находится внутри здания). Или включен источник PRIORITY_BALANCED_POWER_ACCURACY , но оба Wi-Fi и мобильные данные отключены. В таких случаях местоположение не может быть обнаружено, а onLocationChanged() не будет вызываться.
Чтобы исправить №1, я должен был проверить, включены ли требуемые источники местоположения даже до подключения к API сервисов Google, и если они отключены, я уведомил пользователя, который попросил его / ее разрешить доступ к местоположению.
Чтобы решить # 2, я решил использовать LocationRequest.setExpirationDuration() . Я установил тайм-аут примерно через 10 секунд, и сразу после вызова requestLocationUpdates() я отправляю обратный вызов с задержкой на те же 10 секунд. Если вызывается обратный вызов с задержкой до requestLocationUpdates() , это означает, что местоположение не может быть обнаружено по причине № 2. Я делаю три попытки, а затем показываю пользователю сообщение об ошибке.
Документация на Android в этом месте невелика, поэтому я надеюсь, что это поможет.
С ним ваш интервал составляет 0,1 секунду, поэтому очень сложно для чипсета gps обнаружить местоположение. Ваш интервал должен быть> 1 секунда (со мной это> 10)
LocationRequest он должен быть установлен:
setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) потому что PRIORITY_BALANCED_POWER_ACCURACY на открытом воздухе не получает местоположение. Код будет выглядеть так:
Надеюсь, эта помощь.
Посмотрите, получаете ли вы пройденное местоположение, тестируя if (loc == null). Несмотря на то, что это один и тот же провайдер, возможно, какое-то устройство возвращается и бомбардирует, что приводит к тому, что он не стреляет.
Это, возможно, не имеет смысла, но перед этим я столкнулся с этой проблемой, кто-то предположил, что вы должны создать свой собственный LocationListener вместо того, чтобы позволить MainActivity реализовывать LocationListener . В основном это:
Надеюсь это поможет.
Я решил это, установив оба параметра, минимальное расстояние и минимальное время между обновлениями до 0. В соответствии с тем, что я тестировал на двух устройствах, теперь onLocationChanged () вызывается регулярно после запроса обновлений.
Попробуйте удалить и переустановить « google play services ». Установите его с следующей ссылки google google , google play services
Источник
LocationListener NETWORK_PROVIDER включен, но onLocationChanged никогда не вызывается
Я разрабатываю приложение, которое занимает позицию сотового телефона в течение всего 6 и 6 минут в сервисе, оно отлично работает, но иногда метод OnLocationChanged из прослушивателя сетевого провайдера перестает быть вызванным, и я не знаю почему.
Это почему-то перестает быть вызванным, но поставщик включен, и Lister работает, когда я разрешаю или отключаю Провайдера вручную, onProviderEnabled и onProviderDisabled .
Это просто происходит с NETWORK_PROVIDER , GPS_PROVIDER работает хорошо.
Отчет в Samsung Galaxy S3:
По-прежнему получаю «Сем-синал» в течение 4 дней подряд.
Эта проблема уже произошла с Galaxy Y и LG Optimus l5
Я сделал еще один тест, чтобы узнать, получили ли другие приложения позиции NET, и я обнаружил, что они передают одну и ту же проблему, они не могут получить позицию NET только через GetLastknowLocation; Чтобы проверить, что я использовал Galaxy S3 с этой проблемой, и я отключил поставщик GPS. (Протестировано в Цербере).
Я не мог найти объяснений, почему слушатель NETWORKSLOCATIONS перестает давать позиции, но может быть, потому что он не должен работать в течение 2 или 3 дней без остановки.
Я провел несколько тестов с другими приложениями, чтобы проверить, не возникает ли эта проблема с моим назначением, и я обнаружил, что они передаются по одной и той же проблеме, например, в Cerberus:
Я отключу GPS-провайдера в мобильном телефоне (Galaxy S3) с проблемой «Семь синала», посмотрите:
Мой отчет:
И Цербер (печать, сделанная в 14/05/2013) сообщает:
Но когда я открывал Карты Google, он, похоже, работает нормально, я попытался переместиться на дистанционное место, чтобы посмотреть, будет ли он показывать GetLastknowLocation , но нет, карты google помещают меня в нужное место в данный момент, поэтому я понял, что Карты Google использовали motionevent для перемещения меня на карту;
А также распечатайте журнал Google Maps, чтобы получить NetWorkProvider:
У меня возникли аналогичные проблемы с сетевым провайдером, и только решение было принудительным перезапуском устройства . Хотя карта google всегда показывала правильное местоположение, потому что она также использует информацию других датчиков, кроме поставщика сетевого местоположения.
Но вот хорошая новость , а не долгое время назад. Google представил Fuse Location Provider api через свою сервисную платформу Google Play, которая очень проста в использовании, чем поставщики GPS / Network Location.
Совместимость до уровня API 8, теперь, когда я получаю эту странную проблему с сетевым провайдером, в то же время Fused Location дает мне точное местоположение (без перезагрузки устройства).
Я совершил один рабочий проект FusedLocation Test здесь , вы можете клонировать и тестировать себя.
Ниже приведен фрагмент кода: –
У меня точно такая же проблема, и единственным решением для меня является перезагрузка устройства. Что интересно, что ни одно из приложений не содержит информацию о местоположении, кроме карт Google.
Google Maps приложение каким-то образом находит свое местоположение! ..
PS с помощью службы LocationListener в сервисе, поэтому это определенно не проблема плохой ссылки, мертвого объекта и т. Д.
У меня все еще есть эта проблема. Но я все еще ищу ответ, я попытался реализовать это в слушателе NETWORK_PROVIDER:
Потому что: OUT_OF_SERVICE, если поставщик не работает, и это не ожидается в ближайшем будущем; TEMPORARILY_UNAVAILABLE, если поставщик временно недоступен, но ожидается, что он будет доступен в ближайшее время; И AVAILABLE, если поставщик в настоящее время доступен. onStatusChanged
И я думал, что проблема OUT_OF_SERVICE была моей проблемой, и до сих пор нет решения, просто перезагрузив устройство, затем я попытался сделать несколько отчетов, когда это произойдет, и когда этот ocurre попросит пользователя перезагрузить устройство, но мало устройств получат Этот статус.
Кажется, проблема с сетевым провайдером была обнаружена в Android Open Source Project, Issue Tracker: https://code.google.com/p/android/issues/detail?id=57707 . Короче говоря, выпуск был опубликован 17 июля 2013 г. – последний блог 7 января 2015 г., выпущенный с Android 4.1.x, появляется на самых разных устройствах: «Не разрешено в последней библиотеке службы воспроизведения», никаких обходных решений, предложенных в блоге, не было.
Я понимаю кое-что в нашем вопросе; Вы вызываете метод requestGPS, а затем dicover его location.If gps включен, получил через gps. Othervise gott через NET. Когда вы вызываете requestGPS и управляете провайдером, чем получаете lat-lang, но удаляете обновления. (Не вызывайте, потому что вы удалили триггер обновлений);
NETWORK_PROVIDER не обновляется, когда GPS-устройство телефона работает и получает сигнал. Если вы отключите GPS и заставите телефон получать свое местоположение из сети, вы снова начнете получать обновления.
Я думаю, это потому, что ваше приложение «убито» в фоновом режиме. Я столкнулся с этой проблемой раньше, и я решил ее, переместив создание службы LocationListener в службу. Обязательно сохраните ссылку на слушателя. Это может решить проблему.
Источник