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.

Другие вопросы по тегам