Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Mostrar el progreso de la descarga dentro de la actividad con DownloadManager

Estoy tratando de reproducir el mismo progreso que DownloadManager muestra en la barra de notificaciones dentro de mi aplicación, pero nunca se publica mi progreso. Estoy tratando de actualizar con runOnUiThread (), pero por alguna razón no se ha actualizado.

Mi descarga:

String urlDownload = "https://dl.dropbox.com/s/ex4clsfmiu142dy/test.zip?token_hash=AAGD-XcBL8C3flflkmxjbzdr7_2W_i6CZ_3rM5zQpUCYaw&dl=1"; DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlDownload)); request.setDescription("Testando"); request.setTitle("Download"); request.allowScanningByMediaScanner(); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "teste.zip"); final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); final long downloadId = manager.enqueue(request); final ProgressBar mProgressBar = (ProgressBar) findViewById(R.id.progressBar1); new Thread(new Runnable() { @Override public void run() { boolean downloading = true; while (downloading) { DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById(downloadId); Cursor cursor = manager.query(q); cursor.moveToFirst(); int bytes_downloaded = cursor.getInt(cursor .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) { downloading = false; } final double dl_progress = (bytes_downloaded / bytes_total) * 100; runOnUiThread(new Runnable() { @Override public void run() { mProgressBar.setProgress((int) dl_progress); } }); Log.d(Constants.MAIN_VIEW_ACTIVITY, statusMessage(cursor)); cursor.close(); } } }).start(); 

Mi método statusMessage:

 private String statusMessage(Cursor c) { String msg = "???"; switch (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))) { case DownloadManager.STATUS_FAILED: msg = "Download failed!"; break; case DownloadManager.STATUS_PAUSED: msg = "Download paused!"; break; case DownloadManager.STATUS_PENDING: msg = "Download pending!"; break; case DownloadManager.STATUS_RUNNING: msg = "Download in progress!"; break; case DownloadManager.STATUS_SUCCESSFUL: msg = "Download complete!"; break; default: msg = "Download is nowhere in sight"; break; } return (msg); } 

Mi registro funciona perfectamente, mientras que mi descarga se ejecuta dice "Descargar en curso!" Y cuando se completa "Descarga completa!", Pero lo mismo no ocurre en mi progreso, ¿por qué? Realmente necesito algo de ayuda, otras lógicas para hacer que son muy apreciadas

  • Cómo cambiar el color de la barra de progreso en Android? - (Traté de una manera, y no funciona)
  • Barra de progreso vertical en android
  • ¿Cómo cambiar el color en la barra de progreso circular?
  • La barra de progreso horizontal no actualiza su estado
  • Cómo crear una barra de progreso circular en Android que gira sobre ella?
  • Mostrar ProgressBar durante cierto tiempo en Android
  • Android: muestra texto en el centro de la barra de progreso
  • ¿Cuál es la diferencia entre Progressbar y ProgressDialog?
  • 3 Solutions collect form web for “Mostrar el progreso de la descarga dentro de la actividad con DownloadManager”

    Usted está dividiendo dos enteros:

     final double dl_progress = (bytes_downloaded / bytes_total) * 100; 

    Como bytes_downloaded es menor que bytes_total , (bytes_downloaded / bytes_total) será 0, y su progreso será siempre 0.

    Cambie su cálculo a

     final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total); 

    Para obtener el progreso en percentiles enteros (aunque con piso).

    La respuesta de Paul es correcta pero con descargas más grandes golpearás max int bastante rápido y empezarás a obtener un progreso negativo. Utilicé esto para resolver el problema:

     final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total); 

    Como dijo paul, usted está dividiendo dos enteros, con el resultado siempre <1.

    Siempre emite su número antes de dividir, que calculan y regresan en float-point.

    No olvide manejar DivByZero.

     final int dl_progress = (int) ((double)bytes_downloaded / (double)bytes_total * 100f); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.