web-dev-qa-db-fra.com

java.io.IOException: échec de grpc

Lorsque j'utilise l'appel getFromLocationName, je reçois une exception IOException avec la description "grpc failed".

Code qui a couru

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

Erreur les sorties de la console:

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)

Version du SDK Android (niveau API): 25

Les plugins Android Studio sont à jour.

Merci d'avance!

MODIFIER:

Le problème semble être résolu maintenant, voici ma solution.

25
Siqve

METTRE À JOUR:

Le problème semble être résolu maintenant. Je ne suis pas sûr que le problème se soit déjà produit de mon côté, donc si vous aviez ce problème avant ce poste, relancez l'application et voyez s'il fonctionne maintenant.

Si cela ne fonctionne toujours pas, voici ce que j'ai fait moi-même qui "aurait pu le faire fonctionner":

  1. J'ai désinstallé et supprimé tous les fichiers liés à Android Studio. (NOTles fichiers du projet).
  2. J'ai ensuite réinstallé Android Studio et rouvert le projet.
  3. Lors de l'exécution de l'application (j'utilise l'émulateur intégré d'Android Studio), j'ai utilisé un périphérique virtuel et une API de périphérique différents. Cette fois, je l'ai exécuté sur Pixel, avec l'API 23, x86_64.
0
Siqve

Peut-être que vous rencontrez ce problème dans Genymotion et l’émulateur de studio Android uniquement. J'ai rencontré le même problème avec Genymotion et l'émulateur de studio Android, puis je l'ai vérifié dans l'appareil réel Android. Cela fonctionne bien pour moi. L'avez-vous vérifié dans un appareil réel?

9
Arti patel

Je rencontre ce problème sur un appareil Android 4.4.2 à plusieurs reprises. Pour moi, la solution consiste simplement à redémarrer le combiné. Pas de mise à jour du code, pas de désinstallation du studio Android.

6
Aamir Rafiq

Aujourd'hui (2017-09-16), mon Android Studio (2.3.3) dispose d'une mise à jour pour les services Google Play à revision 44. Le problème a été corrigé par la suite. Aucun code ou configuration ne change de mon côté.

3
Tobus

Je pense que cela dépend de l'emplacement de l'appareil. parce que google map ne fonctionne parfois pas correctement dans certaines zones. Je viens d'Iran et j'ai également eu ce problème avec un appareil réel et un émulateur. Après un moment avec ce problème, j'ai utilisé une application vpn et cela a fonctionné sur le périphérique et l'émulateur réels. parce que l'application VPN a changé mon adresse IP.

1
Ali Khazaei

Comme Google écrit, vous ne devriez pas appeler cette méthode sur le fil de l'interface utilisateur

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

J'ai résolu ce problème en exécutant cette opération dans une nouvelle Thread, puis si je dois mettre à jour une vue de l'interface utilisateur, je le ferai sur runOnUiThread

1
Daniele

J'ai finalement réussi à utiliser cette configuration en utilisant la configuration suivante pour le SDK version 25, les outils de compilation et l'émulateur d'API.

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

Également en utilisant Google API version 11.0.2.

1
SagunKho

Dans mon cas, je viens d'activer (autorisation accordée) le paramètre d'autorisation Position from from app.

0
Chulo

Bien que très tard sur la question, voici une réponse pour les utilisateurs de Kotlin .

Je suis tombé sur cette erreur Java.io.IOException: grpc failed en utilisant la fonction getFromLocation de Geocoder. J'utilise Google Pixel 2 comme appareil de test (sous Android 9).

Il y a 3 choses à s'assurer:

  1. Comme noté par de nombreuses personnes ici (et dans la Android documentation ici ), tout ce qui concerne Geocoder doit être fait en dehors de à partir du fil principal de votre application. Pour appuyer ma demande, voici une citation de la documentation Android: "La méthode est synchrone et son travail peut prendre beaucoup de temps. Vous ne devez donc pas l'appeler de principal fil de l'interface utilisateur de votre application. "

Maintenant, il vaut mieux utiliser IntentService pour cette tâche, comme dans la documentation officielle. Cependant, cette personne l'a essayé avec une AsyncTask dans Java et cela a très bien fonctionné (notez que sa tâche avec geocoder était beaucoup moins intensive). Par conséquent, je recommande fortement d'utiliser la méthode AnkodoAsync et d'implémenter tout code concernant Geocoder.

  1. Si possible, utilisez un périphérique physique au lieu d'un émulateur. L'émulateur sur Android Studio m'a posé beaucoup de problèmes et ne me donnait pas les informations d'erreur dont j'avais besoin pour vraiment résoudre le problème.

  2. Réinstallez votre application sur votre périphérique physique et Invalidate Caches/Redémarrez votre projet plusieurs fois.

Assurez-vous également que vous disposez d'une bonne connexion réseau et que celle-ci est activée sur votre appareil.

0
codeabiswas

AOA! réglez la précision du mode de l'appareil sur Gps (uniquement) à l'instant d'une autre option, puis essayez ......

travaillé pour moi les paramètres sont comme ça, je suis postie, vous pouvez également les trouver sur les émulateurs

0
Ch Tpx

Cela se produisait également sur mon téléphone Samsung S7 Edge avec Oreo installé . Cela ne s'est produit que lorsque le mode avion était activé (pas toujours - signifie que quelque chose aurait pu être mis en cache à certains moments). Je n'ai pas exploré les entrailles de Geocoder mais je suppose que cela nécessite une sorte de connectivité pour obtenir les informations (cela expliquerait aussi pourquoi cela se produit si souvent sur les émulateurs) . Pour moi, la solution consistait à vérifier l'état de la connectivité réseau. et appelez-le uniquement lorsque status != NETWORK_STATUS_NOT_CONNECTED.

Pour cela, vous pouvez implémenter un récepteur de diffusion qui écoutera tout changement d'état sur le réseau.

Enregistrer le destinataire

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

Configurer le récepteur de diffusion pour gérer la diffusion

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

Cela fonctionne pour moi si Geocoder est présenté comme un singleton pour application plutôt que de le créer à chaque fois. Assurez-vous d'appeler Geocoder.getFromLocationName () à partir du thread de travail.

Par exemple:

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

class SomeClass {

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