Geocoder.getFromLocation grpc не удалось на реальном устройстве Android
Мне нужно узнать город и штат по широте и долготе. Геокодер выполняет эту функцию, чтобы получить город и штат. Но я получаю ошибку java.io.IOException: grpc failed
в нижней строке только на реальном Android-устройстве. В эмуляторах работает нормально.
new Geocoder(context).getFromLocation(latLng.latitude, latLng.longitude, 1).get(0);
Также я вызывал эту функцию, используя Asynctask, который предлагается в другом посте. Geocoder grpc потерпел неудачу в переполнении стека, но у меня ничего не работает.
И я перезапустил устройство, но оно все еще не работает.
Помощь нужна здесь. Заранее спасибо.
Примечание: я тестировал в Google Pixel XL, Samsung S6 edge, Samsung S4.
2 ответа
Похоже, что это постоянная проблема, о которой сообщалось в системе отслеживания проблем Google как для реальных устройств, так и для эмуляторов. Вы можете сослаться на следующие ошибки:
https://issuetracker.google.com/issues/64418751
https://issuetracker.google.com/issues/64247769
К сожалению, Google еще не решил эти проблемы.
В качестве обходного пути вы можете использовать веб-сервис API геокодирования. Обратите внимание, что на Github есть клиентская библиотека Java для веб-служб:
https://github.com/googlemaps/google-maps-services-java
Используя клиентскую библиотеку Java для веб-сервисов, вы можете реализовать обратный поиск геокодирования, который не должен сообщать вам об ошибке, с которой вы сталкиваетесь с собственным геокодером Android.
Javadoc для клиентской библиотеки находится по адресу
https://googlemaps.github.io/google-maps-services-java/v0.2.5/javadoc/
Надеюсь, это поможет!
Проверьте подключение к интернету. что происходит в какой-то момент между поиском и рендерингом результатов, соединение либо замедляется, либо вообще не работает. поэтому ошибка по умолчанию не найдена GRCP. ваш код должен обрабатывать ошибки такого типа и предотвращать сбои карты
Для меня это было время устройства. Я делал некоторые тесты, и мне пришлось изменить время устройства. Время устройства должно быть установлено правильно, иначе вы получите эту ошибку.
Произошло для меня как с реальным, так и с эмулированным устройством. Решил мой перезапуск приложения после очистки проекта
Это обнаруженная ошибка в Android, ссылку можно найти в ответе @xomen.
В качестве альтернативы вы можете использовать веб-службы. Добавьте это в зависимости Gradle:
api 'com.google.maps:google-maps-services:0.10.2'
Пример кода для получения адресов:
val geoApiCtx = GeoApiContext.Builder()
.apiKey(Util.readGoogleApiKey(ctx))
.build()
val addresses = GeocodingApi.reverseGeocode(geoApiCtx, loc).await()
Вызов для получения адреса через геокодер рекомендуется делать через IntentService.... но если вы находитесь в режиме быстрой разработки и пока не хотите утруждать себя настройкой службы, вы можете использовать команду try/catch блокировать
пример в Котлине:
try{
val addressList = geocoder.getFromLocationName(locationName, 3)
//...
}catch(e: IOException) {
when{
e.message == "grpc failed" -> {/* display a Toast or Snackbar instead*/ }
else -> throw e
}
}
Когда я запускаю эмулятор, у меня такая же проблема. Проблема решена после того, как я запустил реальное устройство.
С помощью эмулятора. Мне пришлось обновить сервисы Google Play на устройстве, и тогда все заработало!
Что я сделал, я изменил свою точность на только GPS, в этом случае приложение не вычисляло мое местоположение. Я снова изменил точность на высокую, и приложение заработало, никаких сбоев. вы можете изменить точность GPS в настройках местоположения на своем мобильном телефоне Android.