Подтвердить что ты не робот

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:

Проблема теперь исправлена, вот мое решение .

4b9b3361

Ответ 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 вещи, чтобы убедиться в:

  1. Как отмечают многие здесь (и в документации по Android здесь), все, что Geocoder с Geocoder должно выполняться отдельно от основного потока вашего приложения. Чтобы поддержать мое утверждение, вот цитата из документации Android: "Метод является синхронным и может занять много времени для его работы, поэтому не следует вызывать его из основного потока пользовательского интерфейса (UI) вашего приложения. "

Теперь для этой задачи лучше всего использовать IntentService как в официальной документации. Тем не менее, этот человек попробовал это с AsyncTask в Java, и он работал просто отлично (обратите внимание, что их задача с geocoder была намного менее интенсивной). Поэтому я настоятельно рекомендую использовать метод doAsync от doAsync и реализовать в нем любой код, касающийся Geocoder.

  1. Если возможно, используйте физическое устройство вместо эмулятора. Эмулятор в Android Studio доставлял мне много хлопот и не давал информацию об ошибке, которая нужна мне для решения проблемы.

  2. Переустановите приложение на физическом устройстве и несколько раз отключите кэши/перезапустите проект.

Также убедитесь, что у вас хорошее сетевое соединение, и оно включено на вашем устройстве.

Ответ 10

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

Ответ 11

Это работает для меня, если представить Geocoder как синглтон для приложения, а не создавать его каждый раз. Обязательно вызовите Geocoder.getFromLocationName() из рабочего потока.

Например:

class Application {
    private val geoCoder = Geocoder(context, Locale.getDefault())
    ...
}

class SomeClass {

    @WorkerThread
    fun doSmth(){
       application.geoCoder.getFromLocationName("London", 10)
       ...
    }
}

Ответ 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), когда на моем реальном устройстве нет подключения к Интернету.