web-dev-qa-db-de.com

java.io.IOException: grpc fehlgeschlagen

Wenn ich den Aufruf getFromLocationName verwende, erhalte ich eine IOException mit der Beschreibung "grpc failed".

Code, der ausgeführt wird

@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();
    }
}

Fehler bei den Konsolenausgaben:

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-Version (API-Ebene): 25

Android Studio Plugins sind auf dem neuesten Stand.

Danke im Voraus!

EDIT:

Das Problem scheint nun behoben zu sein, hier ist meine Lösung.

25
Siqve

UPDATE:

Das Problem scheint jetzt gelöst zu sein. Ich bin mir nicht sicher, ob das Problem jemals an meinem Ende lag. Wenn Sie dieses Problem vor diesem Beitrag hatten, führen Sie die App erneut aus und prüfen, ob sie jetzt funktioniert.

Wenn es immer noch nicht klappt, hier sind die Sachen, die ich selbst gemacht habe, die "vielleicht" dazu geführt haben könnten:

  1. Ich habe alle mit Android Studio verbundenen Dateien deinstalliert und gelöscht. (NICHTdie Projektdateien).
  2. Ich habe dann Android Studio neu installiert und das Projekt wieder geöffnet.
  3. Bei der Ausführung der App (ich verwende den integrierten Emulator von Android Studio) habe ich ein anderes virtuelles Gerät und eine andere Geräte-API verwendet. Diesmal habe ich es auf Pixel mit API 23, x86_64 ausgeführt.
0
Siqve

Möglicherweise haben Sie dieses Problem nur bei genymotion und dem Android-Studio-Emulator. Ich hatte das gleiche Problem mit genymotion und dem Android-Studio-Emulator und habe es dann in einem echten Android-Gerät überprüft. Es funktioniert gut für mich. Hast du es in einem echten Gerät überprüft?

9
Arti patel

Dieses Problem tritt auf Android 4.4.2-Geräten mehrmals auf. Für mich besteht die Lösung darin, das Mobilteil einfach neu zu starten. Kein Code-Update, keine Android Studio-Deinstallation.

6
Aamir Rafiq

Heute (16.09.2017) erhielt mein Android Studio (2.3.3) ein Update für Google Play-Dienste bis Revision 44 . Das Problem wurde danach behoben. Kein Code oder Setup ändert sich von meiner Seite.

3
Tobus

Ich denke, das hängt vom Standort des Geräts ab. weil google map in manchen bereichen manchmal nicht richtig funktioniert. Ich komme aus dem Iran und hatte dieses Problem auch auf einem echten Gerät und einem Emulator. Nach einer Weile ging mit diesem Problem, ich habe eine VPN-Anwendung und es funktionierte auf dem realen Gerät und Emulator. weil vpn anwendung meine ip adresse geändert hat.

1
Ali Khazaei

Wie Google schreibt, sollten Sie diese Methode nicht im UI-Thread aufrufen

https://developer.Android.com/training/location/display-address#Java

Ich habe dieses Problem behoben, indem ich diesen Vorgang in einer neuen Thread ausgeführt habe. Wenn ich dann einige UI-Ansichten aktualisieren muss, mache ich das auf runOnUiThread.

1
Daniele

Ich habe dies schließlich mit der folgenden Konfiguration für SDK, Build Tools und API-Emulator der Version 25 erhalten.

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

Auch mit Google API Version 11.0.2.

1
SagunKho

In meinem Fall habe ich gerade die Berechtigungseinstellung Position von App aktiviert (Erlaubnis erteilt).

0
Chulo

Obwohl dies ziemlich spät ist, finden Sie hier eine Antwort für Kotlin Benutzer.

Ich bin auf diesen Java.io.IOException: grpc failed -Fehler gestoßen, als ich die getFromLocation -Funktion des Geocoders verwendet habe. Ich habe Google Pixel 2 als Testgerät verwendet (mit Android 9).

Es gibt 3 Dinge, auf die Sie achten müssen:

  1. Wie von vielen hier (und in der Android Dokumentation hier ) angemerkt, muss alles, was mit Geocoder zu tun hat getrennt aus dem Hauptthread Ihrer App. Zur Stützung meiner Behauptung hier ein Zitat aus der Dokumentation zu Android: "Die Methode ist synchron und kann lange dauern, bis sie funktioniert. Sie sollten sie daher nicht aufrufen der Hauptthread der Benutzeroberfläche Ihrer App. "

Nun ist es am besten, IntentService für diese Aufgabe zu verwenden, wie in der offiziellen Dokumentation angegeben. diese Person versuchte es jedoch mit einer AsyncTask in Java und es funktionierte einwandfrei (beachten Sie, dass ihre Aufgabe mit geocoder viel weniger intensiv war). Daher empfehle ich dringend, die Anko'sdoAsync -Methode zu verwenden und darin Code zu implementieren, der Geocoder betrifft.

  1. Verwenden Sie nach Möglichkeit ein physisches Gerät anstelle eines Emulators. Der Emulator in Android Studio hat mir viele Probleme bereitet und mir nicht die Fehlerinformationen geliefert, die ich zum eigentlichen Debuggen des Problems benötigte.

  2. Installieren Sie Ihre App erneut auf Ihrem physischen Gerät und validieren Sie den Cache/starten Sie Ihr Projekt mehrmals neu.

Stellen Sie außerdem sicher, dass Sie über eine gute Netzwerkverbindung verfügen und diese auf Ihrem Gerät aktiviert ist.

0
codeabiswas

AOA! Stellen Sie die Genauigkeit des GPS-Modus des Geräts auf (nur GPS) und versuchen Sie es dann ......

arbeitete für mich Einstellungen sind wie folgt, ich bin postie Sie können sie auch auf Emulatoren finden

0
Ch Tpx

Ab August 2019 erhalte ich dies immer noch von Zeit zu Zeit, wenn ich meinen eigenen http-Verkehr mit einem Proxy abschnüffle. Schalten Sie es aus und das Problem ist weg.

0
Johan Franzén

Dies geschah auch auf meinem Samsung S7 Edge-Handy, auf dem Oreo installiert war .. __ Es passierte nur, wenn ich einen Flugzeugmodus eingeschaltet hatte (nicht immer - bedeutet, dass irgendwann etwas zwischengespeichert wurde). Ich habe den Mut des Geocoders nicht erforscht, aber ich gehe davon aus, dass eine gewisse Konnektivität erforderlich ist, um die Informationen zu erhalten (dies würde auch erklären, warum dies bei Emulatoren so häufig vorkommt) und rufen Sie dies nur bei status != NETWORK_STATUS_NOT_CONNECTED auf.

Dazu können Sie einen Broadcast-Empfänger implementieren, der alle Statusänderungen im Netzwerk überwacht.

Empfänger registrieren

IntentFilter networkFilter = new IntentFilter();
networkFilter.addAction("Android.net.conn.CONNECTIVITY_CHANGE");
getActivity().registerReceiver(NetworkChangeReceiver, networkFilter);

Richten Sie den Broadcast-Empfänger für die Übertragung ein

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
    }
  }
};
0
Lubos Prague

Es funktioniert für mich, wenn Sie Geocoder als Singleton für die Anwendung einführen und nicht jedes Mal erstellen. Stellen Sie sicher, dass Sie Geocoder.getFromLocationName () vom Arbeitsthread aus aufrufen.

Zum Beispiel:

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

class SomeClass {

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

Beim Abrufen der Adressliste mit der geocoder.getFromLocation () -Methode trat dieses Problem auf. Das Problem besteht darin, dass das Abrufen der Adressliste vom Breiten- und Längengrad Zeit benötigt oder auf einigen langsamen Geräten mehr Zeit in Anspruch nimmt. ioexception-grpc-failed.

Ich behebe dieses Problem mit 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);
}
}

rufende Position

mViewModel.getLocation(asyncGeocoder, getLat(), getLng(), this);

ViewModel-Methode

public void getLocation(AsyncGeocoder geocoder, Double lat, Double lng, AsyncGeocoder.Callback callback) {
        getCompositeDisposable().add(geocoder.reverseGeocode(lat, lng, callback));
    }
0
Asad Mukhtar

Dieses Problem wurde bereits gemeldet, Sie können andere Stapelbeiträge finden, die darüber sprechen. hier ist ein Kommentar zu Google-Problemen mit einigen der verschiedenen Abstürze von Geocodern. Ich rate Ihnen, Ihren Teil des Codes mit try and catch zu umgeben, damit Ihre Anwendung nicht stoppt.

0
HartWoom