Java.io.IOException: grpc не удалось
Когда я использую call getFromLocationName, я получаю исключение IOException с описанием "grpc failed".
Код, который выполнял
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
try {
Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
List<Address> listAdresses = geocoder.getFromLocationName("London", 10);
Log.i("PlaceInfo", listAdresses.get(0).toString());
} catch (IOException e) {
e.printStackTrace();
}
}
Ошибка выходов консоли:
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: java.io.IOException: grpc failed
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at android.location.Geocoder.getFromLocationName(Geocoder.java:178)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at co.siqve.maplocationdemo.MapsActivity.onMapReady(MapsActivity.java:70)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.android.gms.maps.zzaj.zza(Unknown Source)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.android.gms.maps.internal.zzaq.onTransact(Unknown Source)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at android.os.Binder.transact(Binder.java:499)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.android.gms.maps.internal.aq.a(:com.google.android.gms.DynamiteModulesB:5)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.maps.api.android.lib6.impl.bb.run(:com.google.android.gms.DynamiteModulesB:5)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at android.os.Looper.loop(Looper.java:154)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6119)
07-10 12:01:38.782 13712-13712/co.siqve.maplocationdemo W/System.err: at java.lang.reflect.Method.invoke(Native Method)
07-10 12:01:38.782 13712-13712/co.siqve.maplocationdemo W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
07-10 12:01:38.782 13712-13712/co.siqve.maplocationdemo W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Версия Android SDK (уровень API): 25
Плагины Android Studio обновлены.
Спасибо заранее!
EDIT:
Проблема теперь исправлена, вот мое решение .
Ответы
Ответ 1
UPDATE:
Теперь проблема решена. Я не уверен, была ли эта проблема когда-либо на моем конце, поэтому, если у вас была эта проблема до этого поста, запустите приложение и посмотрите, работает ли он сейчас.
Если он все еще не работает, вот что я сделал сам, чтобы "мог" заставить его работать:
- Я удалил и удалил все файлы, связанные с Android Studio. ( НЕ файлы проекта).
- Затем я переустановил Android Studio и снова открыл проект.
- При запуске приложения (я использую встроенный эмулятор Android Studio) я использовал другое виртуальное устройство и API-интерфейс устройства. На этот раз я запустил его на Pixel с API 23, x86_64.
Ответ 2
Возможно, у вас есть эта проблема только в эмуляторе genymotion и android studio. Я столкнулся с такой же проблемой с genymotion и эмулятором студии android, а затем я проверил его в реальном устройстве Android. Это работает хорошо для меня. Вы проверили его на реальном устройстве?
Ответ 3
Я сталкиваюсь с этой проблемой на устройстве Android 4.4.2 несколько раз. Для меня решение просто перезапустить телефон. Нет обновления кода без удаления студии в студии.
Ответ 4
Как пишет Google, вы не должны вызывать этот метод в потоке пользовательского интерфейса
https://developer.android.com/training/location/display-address#java
Я исправил эту проблему, запустив эту операцию в новом Thread
, а затем, если мне понадобится обновить какое-либо представление пользовательского интерфейса, я сделаю это в runOnUiThread
Ответ 5
Сегодня (2017-09-16) моя Android Studio (2.3.3) получила обновление для сервисов Google Play до версии 44. Проблема была исправлена впоследствии. Никакой код или настройка не меняются с моей стороны.
Ответ 6
Это происходило и на моем телефоне Samsung S7 Edge с установленным Oreo. Это происходило только тогда, когда у меня был включен режим полета (не всегда - значит, что-то могло быть кэшировано в некоторых точках). Я не исследовал внутренности Geocoder, но я предполагаю, что для получения информации требуется какое-то подключение (это также объясняет, почему это происходит так часто на эмуляторах). Для меня решение состояло в том, чтобы проверить состояние сетевого подключения и вызывать его только при status != NETWORK_STATUS_NOT_CONNECTED
.
Для этого вы можете реализовать широковещательный приемник, который будет прослушивать любые изменения статуса в сети.
Зарегистрировать получателя
IntentFilter networkFilter = new IntentFilter();
networkFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
getActivity().registerReceiver(NetworkChangeReceiver, networkFilter);
Настройте приемник трансляции для обработки трансляции
private BroadcastReceiver NetworkChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
int status = NetworkUtil.getConnectivityStatusString(context);
if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
} else {
// do your stuff with geocoder here
}
}
};
Ответ 7
Наконец, я получил эту работу, используя следующую конфигурацию для SDK версии 25, средства сборки и эмулятора API.
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.example..."
minSdkVersion 15
targetSdkVersion 25
Также с помощью API Google версии 11.0.2.
Ответ 8
Я думаю, что это зависит от расположения устройства. потому что карта Google иногда не работает должным образом в какой-то области. Я из Ирана, и у меня также была эта проблема на реальном устройстве и эмуляторе. Через некоторое время я решил использовать приложение vpn, и оно работало на реальном устройстве и эмуляторе. потому что приложение vpn изменило мой IP-адрес.
Ответ 9
Хотя довольно поздно в этом вопросе, вот ответ для пользователей Kotlin.
Я наткнулся на это java.io.IOException: grpc failed
ошибка grpc при использовании функции Geocoder getFromLocation
. Я использовал Google Pixel 2 в качестве моего тестового устройства (под управлением Android 9).
Есть 3 вещи, чтобы убедиться в:
- Как отмечают многие здесь (и в документации по Android здесь), все, что
Geocoder
с Geocoder
должно выполняться отдельно от основного потока вашего приложения. Чтобы поддержать мое утверждение, вот цитата из документации Android: "Метод является синхронным и может занять много времени для его работы, поэтому не следует вызывать его из основного потока пользовательского интерфейса (UI) вашего приложения. "
Теперь для этой задачи лучше всего использовать IntentService
как в официальной документации. Тем не менее, этот человек попробовал это с AsyncTask в Java, и он работал просто отлично (обратите внимание, что их задача с geocoder
была намного менее интенсивной). Поэтому я настоятельно рекомендую использовать метод doAsync
от doAsync
и реализовать в нем любой код, касающийся Geocoder
.
-
Если возможно, используйте физическое устройство вместо эмулятора. Эмулятор в Android Studio доставлял мне много хлопот и не давал информацию об ошибке, которая нужна мне для решения проблемы.
-
Переустановите приложение на физическом устройстве и несколько раз отключите кэши/перезапустите проект.
Также убедитесь, что у вас хорошее сетевое соединение, и оно включено на вашем устройстве.
Ответ 10
В моем случае я просто включил (разрешение предоставлено) настройку Положение из приложения.
Ответ 11
Это работает для меня, если представить Geocoder как синглтон для приложения, а не создавать его каждый раз. Обязательно вызовите Geocoder.getFromLocationName() из рабочего потока.
Например:
class Application {
private val geoCoder = Geocoder(context, Locale.getDefault())
...
}
class SomeClass {
@WorkerThread
fun doSmth(){
application.geoCoder.getFromLocationName("London", 10)
...
}
}
Ответ 12
AOA! Поверните режим точности устройства Gps в момент (только GPS) другого варианта, а затем попробуйте......
у меня сработали настройки вот так, я посту вы их тоже можете найти на эмуляторах
Ответ 13
Для меня это было время устройства. Я делал некоторые тесты, и мне пришлось изменить время устройства. Время устройства должно быть установлено правильно, в противном случае вы получите эту ошибку.
Ответ 14
Я столкнулся с этой проблемой, когда получал список адресов с помощью метода geocoder.getFromLocation(), проблема в том, что получение списка адресов по широте, долготе занимает время или на некоторых медленных устройствах это занимает больше времени, а иногда это также дает мне java-io- IOException-КПГР-не удалось.
Я исправляю эту проблему с помощью Rx Java.
public class AsyncGeocoder {
private final Geocoder geocoder;
public AsyncGeocoder(Context context) {
geocoder = new Geocoder(context);
}
public Disposable reverseGeocode(double lat, double lng, Callback callback) {
return Observable.fromCallable(() -> {
try {
return geocoder.getFromLocation(lat, lng, 1);
} catch (Exception e) {
AppLogger.d("throwable,", new Gson().toJson(e));
e.printStackTrace();
}
return false;
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
//Use result for something
AppLogger.d("throwable,", new Gson().toJson(result));
callback.success((Address) ((ArrayList) result).get(0));
}, throwable -> AppLogger.d("throwable,", new Gson().toJson(throwable)));
}
public interface Callback {
void success(Address address);
void failure(Throwable e);
}
}
Позиция вызова
mViewModel.getLocation(asyncGeocoder, getLat(), getLng(), this);
Метод ViewModel
public void getLocation(AsyncGeocoder geocoder, Double lat, Double lng, AsyncGeocoder.Callback callback) {
getCompositeDisposable().add(geocoder.reverseGeocode(lat, lng, callback));
}
Ответ 15
Об этой проблеме уже сообщалось, вы можете найти другие сообщения в стеке, рассказывающие об этом. Здесь - комментарий к проблеме Google с некоторыми другими причинами сбоя геокодера. Я советую вам окружить свою часть кода попробовать и поймать, чтобы ваше приложение не останавливалось.
Ответ 16
По состоянию на август 2019 года я все еще получаю это время от времени, когда отслеживаю свой собственный http-трафик через прокси. Выключите и проблема исчезла.
Ответ 17
Сбой геокодера SomeTimes, когда широта и долгота содержат более 3 десятичных знаков, или можно сказать, что геокодер не может декодировать каждую широту и долготу. вам нужно ограничить широту и долготу до 3 десятичных знаков. полный код
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(3);
double lat = Double.parseDouble(df.format(currentUserLocation.latitude));
double lon =
Double.parseDouble(df.format(currentUserLocation.longitude));
Geocoder geocoder = new Geocoder(myContext, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat,lon, 1);
String cityName = addresses.get(0).getLocality();
Ответ 18
Я могу воспроизвести эту проблему (java.io.IOException: сбой grpc), когда на моем реальном устройстве нет подключения к Интернету.