La clase de UrlConnection de Android no puede obtener contenido que esté mediante la conexión a Internet 3G

StackOverflow https://stackoverflow.com/questions/8308930

  •  25-10-2019
  •  | 
  •  

Pregunta

Tengo el siguiente código:

URL url = new URL("http://myserver.com/getFile.php");
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();

Todo funciona bien hasta que trabajo con conexión WiFi. Si intento ejecutar este código cuando solo hay una conexión GPRS/3G disponible, conexion.getContentLength() Devuelve -1.

¿Alguna idea de por qué?

EDITAR: He revisado los encabezados usando GetheaderFields (). Son diferentes si uso la red 3G. Básicamente no hay contenido en este caso. ¿Alguna idea de por qué el servidor devuelve diferentes encabezados? No estoy utilizando ningún script especial para proporcionar el archivo, solo obtengo el archivo que se coloca en la ubicación dada.

Encabezado completo para el caso wifi:

{Acept-ranges = [bytes], conexión = [Keep-Alive], content-longitud = [628254], content-type = [text/sencillo; charset = utf-8], date = [martes, 29 de noviembre de 2011 11:22:50 GMT], Etag = ["7A0C7-9961E-4AF3F38778500"], Keep-alive = [TimeOut = 15], Last modificado = [[ Viernes, 14 de octubre de 2011 09:52:52 GMT], Server = [Apache/2.2.9 (Debian) Php/5.2.6-1+Lenny9 con Suhosin-Patch Mod_python/3.3.1 Python/2.6.6 Mod_SSL/2.2 .9 OpenSSL/0.9.8o mod_wsgi/3.3 mod_perl/2.0.4 perl/v5.10.0]}

Encabezado completo para el estuche cuando se usa 3G:

{Acept-ranges = [bytes], conexión = [Keep-Alive], content-type = [text/simple; charset = utf-8], date = [martes, 29 de noviembre de 2011 11:20:33 GMT], Etag = ["7A0C7-9961E-4AF3F38778500"], Keep-alive = [TimeOut = 15], Last modificado = [[ Viernes, 14 de octubre de 2011 09:52:52 GMT], Server = [Apache/2.2.9 (Debian) Php/5.2.6-1+Lenny9 con Suhosin-Patch Mod_python/3.3.1 Python/2.6.6 Mod_SSL/2.2 .9 OpenSSL/0.9.8o mod_wsgi/3.3 mod_perl/2.0.4 perl/v5.10.0], transfer-ending = [fortado], advertencia = [214 Warkaz-Fe07 "Transformación aplicada"]}

¿Fue útil?

Solución

¿Está seguro de que el servidor proporciona la longitud del contenido enviando el encabezado de longitud de contenido en la respuesta?

De los encabezados está claro que su proveedor tiene algún tipo de proxy en su lugar que hace una transformación, despojando el contenido en el proceso. El encabezado de advertencia indica claramente esto. Puede intentar devolver un tipo diferente de tipo de contenido (ahora está recibiendo texto/simple), tal vez este proxy en particular no lo toque. No es una gran solución, por supuesto, hay muchas cosas que los operadores pueden tener que "optimizar" su red de alguna manera.

También puede probar una solicitud de cabeza utilizando un encabezado de rango para obtener un estadio de béisbol del tamaño de contenido. En ese caso, adivinaría algunos rangos, como 100k, 1000k, etc. para ver si el servidor cree que es un rango aceptable. Podrías usar ese rango falso para tu progreso. Una vez más, esta no es una muy buena solución, pero si realmente necesita el progreso, es algo para probar.

Al final, es mejor mostrar el progreso como desconocido si no se sabe la longitud.

Otros consejos

Dado que estas usando

new URL("http://myserver.com/getFile.php");

Supongo que está utilizando un servidor personal que ha configurado, y cuando usa wifi, su teléfono está en su red local y, por lo tanto, puede ver su servidor, pero cuando intenta conectarse a través de GPRS/3G, está intentando acceder a su local. servidor de Internet.

Probablemente se deba a una limitación de su transportista. Trate de evitar necesitar este valor. (Por ejemplo, leyendo el InputStream hasta que no pueda leerlo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top