He utilizado Gestor de descargas de clase dentro de mi actividad a realizar descargas; funciona bien y mi siguiente tarea es mostrar el mismo porcentaje de progreso dentro de mi actividad. No estoy seguro de cómo hacerlo.

Mi código hasta el momento

public class DownloadSampleBook extends Activity{

private long enqueue;
private DownloadManager dm;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample_download);

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                long downloadId = intent.getLongExtra(
                        DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                Query query = new Query();
                query.setFilterById(enqueue);
                Cursor c = dm.query(query);
                if (c.moveToFirst()) {
                    int columnIndex = c
                            .getColumnIndex(DownloadManager.COLUMN_STATUS);
                    if (DownloadManager.STATUS_SUCCESSFUL == c
                            .getInt(columnIndex)) {

                       view.setImageURI(Uri.parse(uriString));
                    }
                }
            }
        }
    };

    registerReceiver(receiver, new IntentFilter(
            DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}

public void onClick(View view) {
    dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    Request request = new Request(
            Uri.parse("http://abc.com/a.png"));
    enqueue = dm.enqueue(request);

}

public void showDownload(View view) {
    Intent i = new Intent();
    i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
    startActivity(i);
}
}

¿Hay algún método que dar el progreso de descarga de porcentaje?

Quiere saber demasiado. No hay solución clara a este

OriginalEl autor Aman Virk | 2013-02-10

3 Comentarios

  1. 20

    Si usted está buscando una manera decente para determinar cuando se consulta la DownloadManager para las actualizaciones de progreso, considere la posibilidad de registrar un ContentObserver para el uri content://downloads/my_downloads

    Ejemplo:

    DownloadManager manager = (DownloadManager) getSystemService( Context.DOWNLOAD_SERVICE );
    manager.enqueue( myRequest );
    
    Uri myDownloads = Uri.parse( "content://downloads/my_downloads" );
    getContentResolver().registerContentObserver( myDownloads, true, new DownloadObserver() );
    
    ...
    
    public static class DownloadObserver extends ContentObserver {
       @Override
       public void onChange( boolean selfChange, Uri uri ) {
          Log.d( "DownloadObserver", "Download " + uri + " updated" );
       }

    Esto produce la siguiente salida de cada fragmento de la larga marcha de descarga es recibido

    D/DownloadObserver(15584): Download content://downloads/my_downloads/437 updated
    D/DownloadObserver(15584): Download content://downloads/my_downloads/437 updated
    D/DownloadObserver(15584): Download content://downloads/my_downloads/437 updated
    D/DownloadObserver(15584): Download content://downloads/my_downloads/437 updated

    donde ‘437’ es el IDENTIFICADOR de tu descarga.

    Tenga en cuenta que esto sigue el contenido de URI se define en la clase android.provider.Downloads que parece estar oculto en el marco y no puede trabajar de manera coherente en todos los dispositivos. (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/provider/Downloads.java#89)

    OriginalEl autor Dennis

  2. 17

    Puede consultar el número de bytes descargados hasta el momento, y el número total de bytes que deben ser descargados, utilizando el query método, de la misma forma como se han consultar el estado de su código de ejemplo. Una vez que tenga esos valores, es bastante fácil calcular el progreso como un porcentaje.

    No parece ser de ninguna manera para ser notificado cuando un nuevo dato es recibido, por lo que sería hasta sondear el gestor de descarga en algunos intervalos regulares para determinar el estado actual de cualquier descarga que desea supervisar.

    Query query = new Query();
    query.setfilterById(downloadId);
    
    Cursor c = dm.query(query);
    if (c.moveToFirst()) {
      int sizeIndex = c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
      int downloadedIndex = c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
      long size = c.getInt(sizeIndex);
      long downloaded = c.getInt(downloadedIndex);
      double progress = 0.0;
      if (size != -1) progress = downloaded*100.0/size;  
      //At this point you have the progress as a percentage.
    }

    Tenga en cuenta que el tamaño total será inicialmente -1 y sólo se rellena una vez que comience la descarga. Así, en el ejemplo de código anterior lo he comprobado por -1 y establecer el progreso a 0 si el tamaño no está establecido aún.

    Sin embargo, usted puede encontrar en algunos de los casos que el tamaño total es nunca volvió (por ejemplo, en un HTTP fragmentada de la transferencia, no habrá encabezado Content-Length de que el tamaño puede ser determinado). Si usted necesita para apoyar ese tipo de servidor, usted probablemente debería proporcionar algún tipo de indicación para el usuario que progresa la descarga y no sólo una barra de progreso que se ha quedado atascado en cero.

    No debería el tamaño de comprobarse los valores cero? Algo como descargar*100.0/(tamaño == 0 ? 1 : el tamaño)

    OriginalEl autor James Holderness

  3. 2

    Tuve un requisito de seguimiento de la descarga de varios archivos. Después de mucho pensar y experimentar, me vino con el siguiente código:

    private void startDownloadThread(final List<DownloadFile> list) {
    //Initializing the broadcast receiver ...
    mBroadCastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
    mFinishedFilesFromNotif.add(intent.getExtras()
    .getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
    }
    };
    IntentFilter intentFilter = new IntentFilter(
    "android.intent.action.DOWNLOAD_COMPLETE");
    DownloadProgressUIFragment.this.getActivity().registerReceiver(mBroadCastReceiver,
    intentFilter);
    //initializing the download manager instance ....
    mDownloadManager = (DownloadManager) getActivity()
    .getSystemService(Context.DOWNLOAD_SERVICE);
    //adding files to the download manager list ...
    for(DownloadFile f: list) {
    mDownloadIds.add(FileUtils.addFileForDownloadInBkg(getApplicationContext(),
    f.getUrl(),
    f.getPath()));
    }
    //starting the thread to track the progress of the download ..
    mProgressThread = new Thread(new Runnable() {
    @Override
    public void run() {
    //Preparing the query for the download manager ...
    DownloadManager.Query q = new DownloadManager.Query();
    long[] ids = new long[mDownloadIds.size()];
    final List<Long> idsArrList= new ArrayList<>();
    int i = 0;
    for (Long id: mDownloadIds) {
    ids[i++] = id;
    idsArrList.add(id);
    }
    q.setFilterById(ids);
    //getting the total size of the data ...
    Cursor c;
    while(true) {
    //check if the downloads are already completed ...
    //Here I have created a set of download ids from download manager to keep
    //track of all the files that are dowloaded, which I populate by creating
    //
    if(mFinishedFilesFromNotif.containsAll(idsArrList)) {
    isDownloadSuccess = true;
    //TODO - Take appropriate action. Download is finished successfully
    return;
    }
    //start iterating and noting progress ..
    c = mDownloadManager.query(q);
    if(c != null) {
    int filesDownloaded = 0;
    float fileFracs = 0f; //this stores the fraction of all the files in
    //download
    final int columnTotalSize = c.getColumnIndex
    (DownloadManager.COLUMN_TOTAL_SIZE_BYTES);
    final int columnStatus = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
    //final int columnId = c.getColumnIndex(DownloadManager.COLUMN_ID);
    final int columnDwnldSoFar =
    c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);
    while (c.moveToNext()) {
    //checking the progress ..
    if(c.getInt(columnStatus) == DownloadManager.STATUS_SUCCESSFUL) {
    filesDownloaded++;
    }
    //If the file is partially downloaded, take its fraction ..
    else if(c.getInt(columnTotalSize) > 0) {
    fileFracs += ((c.getInt(columnDwnldSoFar) * 1.0f) /
    c.getInt(columnTotalSize));
    } else if(c.getInt(columnStatus) == DownloadManager.STATUS_FAILED) {
    //TODO - Take appropriate action. Error in downloading one of the
    //files.
    return;
    }
    }
    c.close();
    //calculate the progress to show ...
    float progress = (filesDownloaded + fileFracs)/ids.length;
    //setting the progress text and bar...
    final int percentage = Math.round(progress * 100.0f);
    final String txt = "Loading ... " + percentage + "%";
    //Show the progress appropriately ...
    }
    }
    }
    });
    mProgressThread.start();
    }

    Y la función a la cola de los archivos son:

    public static long addFileForDownloadInBkg(Context context, String url, String savePath) {
    Uri uri = Uri.parse(url);
    DownloadManager.Request request = new DownloadManager.Request(uri);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
    request.setDestinationUri(Uri.fromFile(new File(savePath)));
    final DownloadManager m = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    return m.enqueue(request);
    }

    Básicamente, he recibido una notificación de forma individual para cada uno de los archivos cuya descarga se ha terminado y, a continuación, agregarlos a un conjunto que es, básicamente, el conjunto que me ayuda a decidir si todas las descargas se han terminado o no. Puedo rastrear el progreso basado en el número de archivos y la fracción de cada ser completa. Espero que esto ayude.

    Hey swapnil por favor puede proporcionar todo el código fuente

    OriginalEl autor Swapnil

Dejar respuesta

Please enter your comment!
Please enter your name here