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.
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":
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?
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.
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é.
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.
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
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.
Dans mon cas, je viens d'activer (autorisation accordée) le paramètre d'autorisation Position from from app.
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:
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
.
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.
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.
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
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
}
}
};
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)
...
}
}