¿Es posible determinar el tamaño del archivo que se va a descargar?
Tengo actualmente el código siguiente que lee un archivo situado en la tela y lo escribe a un archivo en el teléfono:
InputStream inputStream = new URL(sourceFileWebAddress).openStream(); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); FileOutputStream fileOutputStream = new FileOutputStream(targetFile); int count; byte buffer[] = new byte[1024]; while ((count = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) fileOutputStream.write(buffer, 0, count);
¿Alguien sabe si es posible (usando la configuración anterior o de otro modo) determinar el número total de bytes que se deben leer antes de comenzar con la descarga (para publicar el porcentaje de progreso al usuario a medida que se realiza la descarga)?
- Uso de Xtend para el desarrollo de Android (de nuevo)
- Análisis de la matriz JSON con una sub-matriz con GSON?
- leyenda desplazable mpandroidchart piechart
- Manejo de errores de actualización
- Cómo comprobar la matriz de cadenas está vacío o Android nulo?
- ListFragment aparece dos veces en el teléfono
- Incluyendo Tess4J a un proyecto Java como biblioteca en Eclipse
- ¿Cómo cambia el color del subrayado de Edittext en 4.0+?
- Configuración de la transparencia alfa en un listView android
- Androide; Declarar edittext en el cuerpo de la clase (Fuera de cualquier método)
- Cómo llamar a función Java desde c
- Cómo convertir cadena de fecha a largo millseconds
- android.support.v4.app.FragmentTransaction necesario
Utilice el método URLConnection
de URLConnection
URL url = new URL(sourceFileWebAddress); URLConnection connection = url.openConnection(); connection.connect(); int fileLenth = connection.getContentLength(); InputStream inputStream = url.openStream(); BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
Prueba esto usando URLConnnection
URLConnection connection = new URL(sourceFileWebAddress).openStream(); InputStream stream = connection.getInputStream(); System.out.println("total size: "+connection.getContentLength();//size BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); FileOutputStream fileOutputStream = new FileOutputStream(targetFile); int count; byte buffer[] = new byte[1024]; while ((count = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) fileOutputStream.write(buffer, 0, count);
Para determinar el número total de bytes que se deben leer antes de comenzar con la descarga, una forma es obtener sólo los encabezados de respuesta enviando una solicitud HTTP HEAD de la siguiente manera:
import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; public class SimpleHTTPRequest { public static void main(String[] args) { HttpURLConnection connection = null; URL serverAddress = null; try { String sourceFileWebAddress = "http://localhost:8080/mycontents"; serverAddress = new URL(sourceFileWebAddress); //set up out communications stuff connection = null; //Set up the initial connection connection = (HttpURLConnection)serverAddress.openConnection(); //HEAD request will make sure that the contents are not downloaded. connection.setRequestMethod("HEAD"); connection.connect(); System.out.println("========"+connection.getContentLength()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { //close the connection, set all objects to null connection.disconnect(); connection = null; } } }
Esto imprimirá el tamaño del contenido que se descargará sin descargar realmente el contenido.
Puede enviar una solicitud al servidor para devolver el tamaño de archivo. Utilice ese tamaño de archivo en su barra de progreso e inicie la descarga. Entonces, estas son dos solicitudes independientes, pero puede agruparlas en la misma tarea de asyc. Así que primero obtiene el archivo fielszie, haga una llamada a progressUpdate
donde se establecen los valores para la barra de progreso y luego continúe con la descarga con llamadas periódicas a progressUpdate()
para cambiar el estado de la barra de progreso.
El método getContentLength
de URLConnection
debería darle el tamaño del archivo que se descargará. De esto puedes dibujar tu ProgressBar como quieras, actualizándolo (en onProgressUpdate, asumiendo que lo estás haciendo dentro de un AsyncTask.), Siempre que nuevos datos sean procesados por tu fileOutputStream.
Si el servidor no le da un valor en getContentLength (-1 en la mayoría de los casos, pero al menos compruebe si es menor o igual a cero), haga que ProgressBar sea indeterminado.
- Fuentes Eclipse Zoom out & Zoom in Issue
- Gradle no puede encontrar classpath para el complemento de Android