Ява.Ио.Класс IOException: grpc не удалось

когда я использую вызов 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:

проблема, кажется, исправлена, вот мой решение.

8 ответов


может быть, у вас есть эта проблема только в эмуляторе genymotion и Android studio. Я столкнулся с той же проблемой с genymotion и Android studio emulator, а затем я проверил его в Android real device. Это хорошо работает для меня. Вы проверили его в реальном устройстве?


Я сталкиваюсь с этой проблемой на устройстве Android 4.4.2 несколько раз. Для меня решение просто перезагрузить телефон. Нет обновления кода нет удаления Android studio.


сегодня (2017-09-16) моя Android Studio (2.3.3) получила обновление для Google Play services to редакция 44. Впоследствии проблема была исправлена. Никаких изменений кода или настроек с моей стороны.


Я, наконец, получил эту работу, используя следующую конфигурацию для SDK версии 25, инструментов сборки и эмулятора API.

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.example..."
        minSdkVersion 15
        targetSdkVersion 25

также с помощью Google API версии 11.0.2.


обновление:

проблема, кажется, решена. Я не уверен, что это проблема когда-либо была на моем конце, поэтому, если у вас была эта проблема до этого сообщения, повторно запустите приложение и посмотрите, работает ли оно сейчас.

Если он все еще не работает, вот материал, который я сделал сам, который "мог бы" заставить его работать:

  1. Я удалил и удалил все файлы, связанные с Android Studio. (не файлы проекта).
  2. затем я переустановил Android Studio и снова открыл проект.
  3. при запуске приложения (я использую встроенный эмулятор Android Studio) я использовал другое виртуальное устройство и API устройства. На этот раз я запустил его на Pixel, с API 23, x86_64.

в моем случае я просто включил (разрешение) положение от настройки разрешений для приложений.


это происходило также на моем телефоне Samsung S7 Edge с установленным Oreo. Это произошло только тогда, когда у меня был режим самолета (не всегда - означает, что что-то могло быть кэшировано в некоторых точках). Я не исследовал кишки геокодера, но я предполагаю, что для получения информации требуется какая-то связь (это также объясняет, почему это так часто происходит на эмуляторах). Для меня решением было проверить состояние сетевого подключения и вызвать его только тогда, когда 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
    }
  }
};

как Google пишет, Вы не должны вызывать этот метод в UI thread

https://developer.android.com/training/location/display-address#java

я исправил эту проблему, выполнив эту операцию в новом Thread, а затем, если мне нужно обновить некоторое представление пользовательского интерфейса, я сделаю это на runOnUiThread