Pregunta Descargue un archivo con Android y muestre el progreso en un progresoDialog


Intento escribir una aplicación simple que se actualice. Para esto necesito una función simple que pueda descargar un archivo y mostrar el progreso actual en un ProgressDialog. Sé cómo hacer ProgressDialog, pero no estoy seguro de cómo mostrar el progreso actual y cómo descargar el archivo en primer lugar.


914
2018-06-12 10:22


origen


Respuestas:


Hay muchas formas de descargar archivos. A continuación, publicaré las formas más comunes; Depende de usted decidir qué método es mejor para su aplicación.

1. Uso AsyncTask y muestra el progreso de la descarga en un diálogo

Este método le permitirá ejecutar algunos procesos en segundo plano y actualizar la interfaz de usuario al mismo tiempo (en este caso, actualizaremos una barra de progreso).

Este es un código de ejemplo:

// declare the dialog as a member field of your activity
ProgressDialog mProgressDialog;

// instantiate it within the onCreate method
mProgressDialog = new ProgressDialog(YourActivity.this);
mProgressDialog.setMessage("A message");
mProgressDialog.setIndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);

// execute this when the downloader must be fired
final DownloadTask downloadTask = new DownloadTask(YourActivity.this);
downloadTask.execute("the url to the file you want to download");

mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        downloadTask.cancel(true);
    }
});

los AsyncTask se verá así:

// usually, subclasses of AsyncTask are declared inside the activity class.
// that way, you can easily modify the UI thread from here
private class DownloadTask extends AsyncTask<String, Integer, String> {

    private Context context;
    private PowerManager.WakeLock mWakeLock;

    public DownloadTask(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(String... sUrl) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }

            // this will be useful to display download percentage
            // might be -1: server did not report the length
            int fileLength = connection.getContentLength();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream("/sdcard/file_name.extension");

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }

El método anterior (doInBackground) se ejecuta siempre en un hilo de fondo. No debe hacer ninguna tarea de interfaz de usuario allí. Por otro lado, el onProgressUpdate y onPreExecute ejecutar en el hilo de la interfaz de usuario, por lo que puede cambiar la barra de progreso:

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // take CPU lock to prevent CPU from going off if the user 
        // presses the power button during download
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
             getClass().getName());
        mWakeLock.acquire();
        mProgressDialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        // if we get here, length is known, now set indeterminate to false
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgress(progress[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        mWakeLock.release();
        mProgressDialog.dismiss();
        if (result != null)
            Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();
        else
            Toast.makeText(context,"File downloaded", Toast.LENGTH_SHORT).show();
    }

Para que esto se ejecute, necesita el permiso WAKE_LOCK.

<uses-permission android:name="android.permission.WAKE_LOCK" />

2. Descargar del servicio

La gran pregunta aquí es: ¿Cómo actualizo mi actividad de un servicio?. En el siguiente ejemplo, vamos a utilizar dos clases de las que puede que no tenga conocimiento: ResultReceiver y IntentService. ResultReceiver es el que nos permitirá actualizar nuestro hilo de un servicio; IntentService es una subclase de Service que genera un hilo para hacer un trabajo de fondo desde allí (debes saber que Service se ejecuta en realidad en el mismo hilo de su aplicación; cuando te extiendes Service, debe generar manualmente nuevos hilos para ejecutar operaciones de bloqueo de CPU).

El servicio de descarga puede verse así:

public class DownloadService extends IntentService {
    public static final int UPDATE_PROGRESS = 8344;
    public DownloadService() {
        super("DownloadService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        String urlToDownload = intent.getStringExtra("url");
        ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
        try {
            URL url = new URL(urlToDownload);
            URLConnection connection = url.openConnection();
            connection.connect();
            // this will be useful so that you can show a typical 0-100% progress bar
            int fileLength = connection.getContentLength();

            // download the file
            InputStream input = new BufferedInputStream(connection.getInputStream());
            OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk");

            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                // publishing the progress....
                Bundle resultData = new Bundle();
                resultData.putInt("progress" ,(int) (total * 100 / fileLength));
                receiver.send(UPDATE_PROGRESS, resultData);
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Bundle resultData = new Bundle();
        resultData.putInt("progress" ,100);
        receiver.send(UPDATE_PROGRESS, resultData);
    }
}

Agregue el servicio a su manifiesto:

<service android:name=".DownloadService"/>

Y la actividad se verá así:

// initialize the progress dialog like in the first example

// this is how you fire the downloader
mProgressDialog.show();
Intent intent = new Intent(this, DownloadService.class);
intent.putExtra("url", "url of the file to download");
intent.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(intent);

Aquí estabas ResultReceiver viene a jugar:

private class DownloadReceiver extends ResultReceiver{
    public DownloadReceiver(Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        super.onReceiveResult(resultCode, resultData);
        if (resultCode == DownloadService.UPDATE_PROGRESS) {
            int progress = resultData.getInt("progress");
            mProgressDialog.setProgress(progress);
            if (progress == 100) {
                mProgressDialog.dismiss();
            }
        }
    }
}

2.1 Usar la biblioteca de Groundy

Groundy es una biblioteca que básicamente te ayuda a ejecutar trozos de código en un servicio en segundo plano, y se basa en el ResultReceiver concepto mostrado arriba. Esta biblioteca es obsoleto En el momento. Así es como el todo el código se vería así:

La actividad en la que está mostrando el diálogo ...

public class MainActivity extends Activity {

    private ProgressDialog mProgressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.btn_download).setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                String url = ((EditText) findViewById(R.id.edit_url)).getText().toString().trim();
                Bundle extras = new Bundler().add(DownloadTask.PARAM_URL, url).build();
                Groundy.create(DownloadExample.this, DownloadTask.class)
                        .receiver(mReceiver)
                        .params(extras)
                        .queue();

                mProgressDialog = new ProgressDialog(MainActivity.this);
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                mProgressDialog.setCancelable(false);
                mProgressDialog.show();
            }
        });
    }

    private ResultReceiver mReceiver = new ResultReceiver(new Handler()) {
        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            super.onReceiveResult(resultCode, resultData);
            switch (resultCode) {
                case Groundy.STATUS_PROGRESS:
                    mProgressDialog.setProgress(resultData.getInt(Groundy.KEY_PROGRESS));
                    break;
                case Groundy.STATUS_FINISHED:
                    Toast.makeText(DownloadExample.this, R.string.file_downloaded, Toast.LENGTH_LONG);
                    mProgressDialog.dismiss();
                    break;
                case Groundy.STATUS_ERROR:
                    Toast.makeText(DownloadExample.this, resultData.getString(Groundy.KEY_ERROR), Toast.LENGTH_LONG).show();
                    mProgressDialog.dismiss();
                    break;
            }
        }
    };
}

UN GroundyTask implementación utilizada por Groundy para descargar el archivo y mostrar el progreso:

public class DownloadTask extends GroundyTask {    
    public static final String PARAM_URL = "com.groundy.sample.param.url";

    @Override
    protected boolean doInBackground() {
        try {
            String url = getParameters().getString(PARAM_URL);
            File dest = new File(getContext().getFilesDir(), new File(url).getName());
            DownloadUtils.downloadFile(getContext(), url, dest, DownloadUtils.getDownloadListenerForTask(this));
            return true;
        } catch (Exception pokemon) {
            return false;
        }
    }
}

Y solo agrega esto al manifiesto:

<service android:name="com.codeslap.groundy.GroundyService"/>

No podría ser más fácil, creo. Solo toma el último frasco de Github y estás listo para ir. Manten eso en mente GroundyEl objetivo principal es hacer llamadas a APIS REST externas en un servicio en segundo plano y publicar resultados en la interfaz de usuario con facilidad. Si estás haciendo algo así en tu aplicación, podría ser realmente útil.

2.2 Uso https://github.com/koush/ion

3. Uso DownloadManager clase (GingerBread y más nuevo solamente)

GingerBread trajo una nueva característica, DownloadManager, que le permite descargar archivos fácilmente y delegar en el sistema el trabajo arduo de manejar hilos, secuencias, etc.

Primero, veamos un método de utilidad:

/**
 * @param context used to check the device version and DownloadManager information
 * @return true if the download manager is available
 */
public static boolean isDownloadManagerAvailable(Context context) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
        return true;
    }
    return false;
}

El nombre del método lo explica todo. Una vez que estés seguro DownloadManager está disponible, puedes hacer algo como esto:

String url = "url you want to download";
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("Some descrition");
request.setTitle("Some title");
// in order for this if to run, you must use the android 3.2 to compile your app
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    request.allowScanningByMediaScanner();
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "name-of-the-file.ext");

// get download service and enqueue file
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);

El progreso de la descarga se mostrará en la barra de notificaciones.

Pensamientos finales

Los métodos primero y segundo son solo la punta del iceberg. Hay muchas cosas que debes tener en cuenta si quieres que tu aplicación sea sólida. Aquí hay una breve lista:

  • Debe verificar si el usuario tiene una conexión a Internet disponible
  • Asegúrate de tener los permisos correctos (INTERNET y WRITE_EXTERNAL_STORAGE); además ACCESS_NETWORK_STATE si quieres verificar la disponibilidad de internet
  • Asegúrese de que el directorio donde va a descargar los archivos exista y tenga permisos de escritura.
  • Si la descarga es demasiado grande, puede implementar una forma de reanudar la descarga si fallaron los intentos anteriores.
  • Los usuarios estarán agradecidos si les permite interrumpir la descarga.

A menos que necesite un control detallado del proceso de descarga, considere usar DownloadManager (3) porque ya maneja la mayoría de los elementos enumerados anteriormente.

Pero también considere que sus necesidades pueden cambiar. Por ejemplo, DownloadManager  no tiene memoria caché de respuesta. Descargue ciegamente el mismo archivo grande varias veces. No hay una manera fácil de solucionarlo después del hecho. Donde si comienzas con un básico HttpURLConnection (1, 2), entonces todo lo que necesita es agregar un HttpResponseCache. Entonces, el esfuerzo inicial de aprender las herramientas básicas y estándares puede ser una buena inversión.

Esta clase quedó obsoleta en el nivel 26 de API. ProgressDialog es un modal   diálogo, que evita que el usuario interactúe con la aplicación. En lugar   de usar esta clase, debe usar un indicador de progreso como   ProgressBar, que puede integrarse en la interfaz de usuario de su aplicación. Alternativamente,   puede usar una notificación para informar al usuario del progreso de la tarea. Para más detalles Enlazar


1726
2017-08-29 14:34



¡No olvide agregar permisos a su archivo de manifiesto si va a descargar cosas de Internet!

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloandroid"
    android:versionCode="1"
    android:versionName="1.0">

        <uses-sdk android:minSdkVersion="10" />

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

        <application 
            android:icon="@drawable/icon" 
            android:label="@string/app_name" 
            android:debuggable="true">

        </application>

</manifest>

98
2018-06-12 14:21



Sí, el código anterior funcionará. Pero si está actualizando su progressbar en onProgressUpdate de Asynctask  y presiona el botón Atrás o termina tu actividad AsyncTask pierde su seguimiento con su UI. Y cuando vuelva a su actividad, incluso si la descarga se ejecuta en segundo plano, no verá ninguna actualización en la barra de progreso. Pronto OnResume() intenta ejecutar un hilo como runOnUIThread con una tarea de temporizador que actualiza tu progressbar con valores actualizados desde el AsyncTask funcionamiento de fondo.

private void updateProgressBar(){
    Runnable runnable = new updateProgress();
    background = new Thread(runnable);
    background.start();
}

public class updateProgress implements Runnable {
    public void run() {
        while(Thread.currentThread()==background)
            //while (!Thread.currentThread().isInterrupted()) {
            try {
                Thread.sleep(1000); 
                Message msg = new Message();
                progress = getProgressPercentage();        
                handler.sendMessage(msg);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } catch (Exception e) {
        }
    }
}

private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        progress.setProgress(msg.what);
    }
};

No olvides Destruir el hilo cuando tu actividad no es visible.

private void destroyRunningThreads() {
    if (background != null) {
        background.interrupt();
        background=null;
    }
}

27
2018-05-20 23:29



Yo he modificado AsyncTask clase para manejar la creación de progressDialog en el mismo contexto. Creo que el siguiente código será más reutilizable. (se puede invocar desde cualquier actividad solo pasar contexto, archivo de destino, mensaje de diálogo)

public static class DownloadTask extends AsyncTask<String, Integer, String> {
    private ProgressDialog mPDialog;
    private Context mContext;
    private PowerManager.WakeLock mWakeLock;
    private File mTargetFile;
    //Constructor parameters :
    // @context (current Activity)
    // @targetFile (File object to write,it will be overwritten if exist)
    // @dialogMessage (message of the ProgresDialog)
    public DownloadTask(Context context,File targetFile,String dialogMessage) {
        this.mContext = context;
        this.mTargetFile = targetFile;
        mPDialog = new ProgressDialog(context);

        mPDialog.setMessage(dialogMessage);
        mPDialog.setIndeterminate(true);
        mPDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mPDialog.setCancelable(true);
        // reference to instance to use inside listener
        final DownloadTask me = this;
        mPDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                me.cancel(true);
            }
        });
        Log.i("DownloadTask","Constructor done");
    }

    @Override
    protected String doInBackground(String... sUrl) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }
            Log.i("DownloadTask","Response " + connection.getResponseCode());

            // this will be useful to display download percentage
            // might be -1: server did not report the length
            int fileLength = connection.getContentLength();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream(mTargetFile,false);

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    Log.i("DownloadTask","Cancelled");
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // take CPU lock to prevent CPU from going off if the user
        // presses the power button during download
        PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                getClass().getName());
        mWakeLock.acquire();

        mPDialog.show();

    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        // if we get here, length is known, now set indeterminate to false
        mPDialog.setIndeterminate(false);
        mPDialog.setMax(100);
        mPDialog.setProgress(progress[0]);

    }

    @Override
    protected void onPostExecute(String result) {
        Log.i("DownloadTask", "Work Done! PostExecute");
        mWakeLock.release();
        mPDialog.dismiss();
        if (result != null)
            Toast.makeText(mContext,"Download error: "+result, Toast.LENGTH_LONG).show();
        else
            Toast.makeText(mContext,"File Downloaded", Toast.LENGTH_SHORT).show();
    }
}

15
2018-05-07 15:56



Te recomendaría que uses mi Proyecto Netroid, Se basa en Voleo. He agregado algunas funciones, como devolución de llamada de múltiples eventos, gestión de descarga de archivos. Esto podría ser de alguna ayuda.


14
2018-02-10 00:17



No te olvides de reemplazar "/ sdcard ..." por archivo nuevo("/ mnt / sdcard / ...") de lo contrario obtendrá un FileNotFoundException


8
2017-08-01 14:55



encontré esta La publicación de blog es muy útil. Usar loopJ para descargar archivos, solo tiene una función simple, será útil para algunos chicos nuevos de Android.


8
2017-09-19 13:41



Mientras comenzaba a aprender desarrollo de Android, aprendí que ProgressDialog es el camino a seguir. Ahí está el setProgress método de ProgressDialog que se puede invocar para actualizar el nivel de progreso a medida que se descarga el archivo.

Lo mejor que he visto en muchas aplicaciones es que personalizan los atributos de este diálogo de progreso para dar una mejor apariencia al cuadro de diálogo de progreso que la versión original. Es bueno mantener al usuario involucrado con algunas animaciones de ranas, elefantes o gatos / cachorros. Cualquier animación con en el diálogo de progreso atrae a los usuarios y no tienen ganas de que los esperen durante mucho tiempo.

Escribiré una publicación de blog en ProgressDialog y compartir aquí pronto.

Editar: Mostrar barra de progreso al descargar un archivo en Android


6
2017-07-02 17:11



Mi consejo personal es usar Diálogo de progreso y acumular antes de la ejecución, o iniciar en OnPreExecute() , publique el progreso a menudo si usa el estilo horizontal de la barra de progreso del cuadro de diálogo de progreso. La parte restante es para optimizar el algoritmo de doInBackground.


5
2018-05-06 19:27



Use la biblioteca Android Query, realmente genial. Puede cambiarla para usarla ProgressDialog como ve en otros ejemplos, este mostrará la vista de progreso de su diseño y lo ocultará después de la finalización.

File target = new File(new File(Environment.getExternalStorageDirectory(), "ApplicationName"), "tmp.pdf");
new AQuery(this).progress(R.id.progress_view).download(_competition.qualificationScoreCardsPdf(), target, new AjaxCallback<File>() {
    public void callback(String url, File file, AjaxStatus status) {
        if (file != null) {
            // do something with file  
        } 
    }
});

5
2017-10-03 11:06



Permisos

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission 
   android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Utilizando HttpURLConnection

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class DownloadFileUseHttpURLConnection extends Activity {

ProgressBar pb;
Dialog dialog;
int downloadedSize = 0;
int totalSize = 0;
TextView cur_val;
String dwnload_file_path =  
"http://coderzheaven.com/sample_folder/sample_file.png";
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button) findViewById(R.id.b1);
    b.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
             showProgress(dwnload_file_path);

                new Thread(new Runnable() {
                    public void run() {
                         downloadFile();
                    }
                  }).start();
        }
    });
}

void downloadFile(){

    try {
        URL url = new URL(dwnload_file_path);
        HttpURLConnection urlConnection = (HttpURLConnection)   
 url.openConnection();

        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);

        //connect
        urlConnection.connect();

        //set the path where we want to save the file           
        File SDCardRoot = Environment.getExternalStorageDirectory(); 
        //create a new file, to save the downloaded file 
        File file = new File(SDCardRoot,"downloaded_file.png");

        FileOutputStream fileOutput = new FileOutputStream(file);

        //Stream used for reading the data from the internet
        InputStream inputStream = urlConnection.getInputStream();

        //this is the total size of the file which we are downloading
        totalSize = urlConnection.getContentLength();

        runOnUiThread(new Runnable() {
            public void run() {
                pb.setMax(totalSize);
            }               
        });

        //create a buffer...
        byte[] buffer = new byte[1024];
        int bufferLength = 0;

        while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
            fileOutput.write(buffer, 0, bufferLength);
            downloadedSize += bufferLength;
            // update the progressbar //
            runOnUiThread(new Runnable() {
                public void run() {
                    pb.setProgress(downloadedSize);
                    float per = ((float)downloadedSize/totalSize) *     
                    100;
                    cur_val.setText("Downloaded " + downloadedSize +  

                    "KB / " + totalSize + "KB (" + (int)per + "%)" );
                }
            });
        }
        //close the output stream when complete //
        fileOutput.close();
        runOnUiThread(new Runnable() {
            public void run() {
                // pb.dismiss(); // if you want close it..
            }
        });         

    } catch (final MalformedURLException e) {
        showError("Error : MalformedURLException " + e);        
        e.printStackTrace();
    } catch (final IOException e) {
        showError("Error : IOException " + e);          
        e.printStackTrace();
    }
    catch (final Exception e) {
        showError("Error : Please check your internet connection " +  
e);
    }       
}

void showError(final String err){
    runOnUiThread(new Runnable() {
        public void run() {
            Toast.makeText(DownloadFileDemo1.this, err,  
      Toast.LENGTH_LONG).show();
        }
    });
}

void showProgress(String file_path){
    dialog = new Dialog(DownloadFileDemo1.this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.myprogressdialog);
    dialog.setTitle("Download Progress");

    TextView text = (TextView) dialog.findViewById(R.id.tv1);
    text.setText("Downloading file from ... " + file_path);
    cur_val = (TextView) dialog.findViewById(R.id.cur_pg_tv);
    cur_val.setText("Starting download...");
    dialog.show();

     pb = (ProgressBar)dialog.findViewById(R.id.progress_bar);
     pb.setProgress(0);
            pb.setProgressDrawable(
      getResources().getDrawable(R.drawable.green_progress));  
  }
}

2
2017-08-28 18:34