failed - java.io.IOException: error de grpc
geocoder grpc failed (9)
Al igual que Google escribe, no deberías llamar a este método en el hilo de la IU
https://developer.android.com/training/location/display-address#java
Solucioné este problema ejecutando esta operación en un nuevo Thread
, y luego, si necesito actualizar alguna vista de la interfaz de usuario, lo haré en runOnUiThread
Cuando utilizo la llamada getFromLocationName, obtengo una excepción IOException con la descripción "error de grpc".
Código que se ejecuta
@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();
}
}
Error en las salidas de la consola:
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)
Versión de Android SDK (Nivel API): 25
Los complementos de Android Studio están actualizados.
¡Gracias por adelantado!
EDITAR:
El problema parece estar solucionado ahora, aquí está mi solution.
En mi caso, acabo de activar (permiso otorgado) la posición de la configuración de permiso de la aplicación.
Esto también sucedió en mi teléfono Samsung S7 Edge con Oreo instalado. Solo sucedió cuando tenía activado el modo avión (no siempre, significa que algo podría haber sido almacenado en caché en algunos puntos). No exploré las entrañas de Geocoder, pero asumo que requiere algún tipo de conectividad para obtener la información (eso también explicaría por qué esto sucede con tanta frecuencia en los emuladores). Para mí, la solución fue comprobar el estado de conectividad de la red y llamar a esto solo cuando status != NETWORK_STATUS_NOT_CONNECTED
.
Para esto, puede implementar un receptor de difusión, que escuchará cualquier cambio de estado en la red.
Registrar receptor
IntentFilter networkFilter = new IntentFilter();
networkFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
getActivity().registerReceiver(NetworkChangeReceiver, networkFilter);
Configurar el receptor de difusión para manejar la emisión
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
}
}
};
Finalmente conseguí que esto funcionara utilizando la siguiente configuración para la versión 25 SDK, Build Tools y el emulador de API.
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.example..."
minSdkVersion 15
targetSdkVersion 25
También utilizando la API de Google versión 11.0.2.
Funciona para mí si introduzco Geocoder como singleton para la aplicación en lugar de crearlo cada vez. Asegúrese de llamar a Geocoder.getFromLocationName () desde el subproceso de trabajo.
Por ejemplo:
class Application {
private val geoCoder = Geocoder(context, Locale.getDefault())
...
}
class SomeClass {
@WorkerThread
fun doSmth(){
application.geoCoder.getFromLocationName("London", 10)
...
}
}
Hoy (2017-09-16) mi Android Studio (2.3.3) recibió una actualización para los servicios de Google Play a la revisión 44 . El problema se solucionó después. No hay cambios de código o configuración de mi lado.
Me enfrento a este problema en el dispositivo Android 4.4.2 varias veces. Para mí, la solución es simplemente reiniciar el teléfono. Sin actualización de código no hay desinstalación de Android Studio.
Puede que tenga este problema solo en genymotion y en el emulador de Android Studio. Me enfrenté al mismo problema con genymotion y el emulador de Android Studio y luego lo revisé en un dispositivo Android real. Está funcionando bien para mí. ¿Lo comprobaste en dispositivo real?
ACTUALIZAR:
El problema parece estar resuelto ahora. No estoy seguro de si el problema alguna vez estuvo en mi lado, por lo que si tuvo este problema antes de esta publicación, vuelva a ejecutar su aplicación y vea si funciona ahora.
Si aún no funciona, he aquí las cosas que hice yo mismo que "podrían" haberlo hecho funcionar:
- Desinstalé y borré todos los archivos relacionados con Android Studio. ( NO los archivos del proyecto).
- Luego reinstalé Android Studio y volví a abrir la copia de seguridad del proyecto.
- Al ejecutar la aplicación (estoy usando el emulador incorporado de Android Studio), utilicé un dispositivo virtual y una API de dispositivo diferentes. Esta vez lo ejecuté en Pixel, con API 23, x86_64.