PolyUtil.decode Lanzar StringIndexOutOfBoundsException

2 minutos de lectura

avatar de usuario de lifespunchingbag
saco de boxeo

Al usar Google Maps PolyUtil.decode me da este error java.lang.StringIndexOutOfBoundsException: length=60; index=60 at java.lang.String.charAt(Native Method) at com.google.maps.android.PolyUtil.decode(PolyUtil.java:464)
Cuando rastreé el error, me da PolyUtil.class, que luego me lleva a esta línea en particular.

do{
  b = encodedPath.charAt(index++) - 63 - 1;
  result += b << shift;
  shift += 5;
} while(b >= 31);

Pero hasta ahora, este error solo se produce para una cadena codificada en particular. Cuando decodifico otra cadena codificada de la misma longitud en caracteres o una que es más larga o más corta, no arroja el error. Incluso probé la cadena que da el error con la herramienta de decodificador interactivo de polilíneas de Google y se muestra correctamente. ¿Alguna razón por la que se produce este error?

  • ¿Tienes alguna solución?

    – sreenadh

    31 de enero de 2020 a las 12:47

  • Verifique la cadena codificada para ver si hay caracteres no válidos. Lo descubrí después de notar que faltaban algunos caracteres de escape, como \\n. En mi caso \n en la cadena codificada arrojaba el error, pero cuando lo cambié a \\n entonces fue capaz de decodificar correctamente.

    – saco de boxeo

    31 de enero de 2020 a las 15:14


  • mc}r@ejvtMC\\\\XfAv@zDrAvGZ~ADVK?kBgJ{@iEi@kBQc@q@kAwAeCiAkBQEEAKEGIEM?KDOROR?LDBBN?pA?vBGv@Bp@FhBVxD@GXIJa@@uA~@wEvCSv@ (Esta es una muestra de mi cadena codificada) Consiste en barras de escape. Cuando elimino las barras diagonales inversas, muestra “StringIndexOutOfBoundsException” y la ruta dibujada es extraña. No dibujar por los caminos. No es en todos los casos.

    – sreenadh

    3 de febrero de 2020 a las 12:13

  • Le sugiero que vuelva a dibujar la línea para asegurarse de que la tiene correcta, cópiela y luego vuelva a pegarla en la herramienta para asegurarse de que es lo que se dibujó. Luego guarde esa cadena codificada en algún lugar y luego péguela en la decodificación de PolyUtil. Tal vez en algún lugar del camino le pasó algo. Si todavía da el error con la nueva cadena, péguelo aquí y lo revisaré.

    – saco de boxeo

    3 de febrero de 2020 a las 15:32


El problema son las barras invertidas dobles “\\”. Simplemente reemplácelos con una sola barra invertida “\”, antes de decodificar.

Como sigue:

String newEncodedString = encodedString.replace("\\\\","\\");
PolyUtil.decode(newEncodedString);

Avatar de usuario de Jibin Joy
Alegría Jibin

    try {
       PolyUtil.decode(encodedFullPath)
    } catch (e: Exception) {
       val modifiedEncodedPath = "$encodedFullPath@"
        PolyUtil.decode(modifiedEncodedPath)
    }

fix for some encoded paths, used by:
https://developers.google.com/maps/documentation/utilities/polylineutility


explanation can be found here
https://developers.google.com/maps/documentation/utilities/polylinealgorithm

¿Ha sido útil esta solución?