Geocoder devuelve una dirección con longitud cero

Geocoder estaba trabajando bien hasta hoy. Comenzó a devolver String con longitud 0. Nota: Esto no es un duplicado de los hilos de Geocoder, utilicé el servicio de intención y AsyncTask para obtenerlo antes de iniciar el hilo (y el método AsyncTask estaba funcionando bien durante 8 meses), marcó este código y el nuevo código de Google con FusedLocationProviderClient Código) también devuelve cadena con longitud cero. Este enlace de la página oficial de Android muestra cómo obtenerlo con el servicio de intenciones.

Tengo la dirección completa en Android 5.1, pero en Android 7.1 devuelve una dirección con longitud cero.

Código que solía usar y funcionó bien hasta hoy.

private void getAddressFromCoordinates() { new AsyncTask<Void, String, Void>() { @Override protected Void doInBackground(Void... params) { try { addresses.clear(); addresses.addAll(geocoder.getFromLocation(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude(), 1)); } catch (IOException e) { e.printStackTrace(); showToastAsync(getString(R.string.activity_loc_no_location_info)); } catch (IllegalArgumentException illegalArgumentException) { // Catch invalid latitude or longitude values. showToastAsync("Invalid latitude or longitude values"); } // Handle case where no address was found. if (addresses == null || addresses.size() == 0) { showToastAsync(getString(R.string.activity_loc_no_address_is_found)); } else { Address address = addresses.get(0); ArrayList<String> addressFragments = new ArrayList<String>(); for (int i = 0; i < address.getMaxAddressLineIndex(); i++) { addressFragments.add(address.getAddressLine(i)); } addressInfo = TextUtils.join(System.getProperty("line.separator"), addressFragments); addressSingleLine = LocationActivity.addressInfo.replaceAll("[\r\n]+", " "); } return null; } }.execute(); } 

La respuesta es añadir = a para que el bucle no recupere una dirección con longitud cero en Android 7. No es necesario que realices esto en algunas versiones. También el código en páginas referenciadas de Github de Google está faltando. Por eso no pude encontrar la razón.

El problema es esta línea:

Para (int i = 0; i <address.getMaxAddressLineIndex (); i ++)

Debe ser: for (int i = 0; i <= address.getMaxAddressLineIndex (); i ++) Debido a que getMaxAddressLineIndex devuelve el índice más grande.

Acabo de notar el mismo problema en mi código hace un tiempo. Aparentemente se trata de un cambio en la API como se puede ver en la documentación . Ahora getMaxAddressLineIndex() :

Devuelve el índice más grande actualmente en uso para especificar una línea de dirección. Si no se especifica ninguna línea de dirección, se devuelve -1.

Por lo que necesita cambiar la condición de su bucle for según lo sugerido por @DavidBar

  • Android, Solicitud de ubicación, establecer la duración de caducidad no funciona
  • FINE_LOCATION tiene menos precisión que COARSE_LOCATION
  • MyLocationOverlay dispatchTap () no se propaga
  • ¿Cómo obtener la ubicación exacta actual en android sin conexión a Internet?
  • Cómo obtener la ubicación actual latitud y longitud en android
  • Cómo obtener la ubicación de las coordenadas
  • Uso de GoogleApiClient + LocationServices sin actualizar
  • Android: Alerta de proximidad y consumo de batería
  • Android LocationRequest: obtener una devolución de llamada cuando la solicitud caduca
  • ¿Cómo conseguir la ubicación gruesa usando Wifi o GSM o GPS, lo que esté disponible?
  • El permiso ACCESS_COARSE_LOCATION da una precisión de torre celular en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.