Android DownloadManager Progress

sto sviluppando un'applicazione in cui gli utenti possono scaricare diversi pacchetti di contenuti. Per il process di download utilizzo la class DownloadManager. Questo funziona bene finora.

La mia domanda è come posso get il progresso corrente di un download in esecuzione che è stato avviato con DownloadManager. So che c'è la buildin Download Notification e così via. Ma per me è necessario che ottengo l'avanzamento del download in esecuzione in modo da poterlo utilizzare per mostrare il progresso in una barra di progresso personalizzata nella mia app. Finora non sono riuscito a recuperare il progresso.

  • Perdita di memory in WebView
  • Dove posso scaricare la documentazione Android SDK?
  • Broadcastreceiver per get le informazioni di ServiceState
  • come passare in due diversi tipi di dati a AsyncTask, Android
  • Indice di frammento di risultati di attività Fuori gamma: 0x20001
  • Calcola la dimensione di una visualizzazione di liste o come dirle di espandere completamente
  • È anche ansible o sono solo cieco e non riesco a trovare la soluzione.

    Spero che qualcuno possa aiutarmi …

  • Android - Come posso specificare il peso in modo programmato per un RelativeLayout?
  • Android React-Native - Ottenga le variables dall'intento
  • servizi android - errore: servizio non registrato
  • Google Map Direzione Api con Retrofit
  • Errore durante l'innalzamento della class android.support.design.widget.TabLayout
  • Come disegnare la vista in cima alla tastiera soft come WhatsApp?
  • 2 Solutions collect form web for “Android DownloadManager Progress”

    Sto cercando un modo migliore per farlo anche questo, ma finora sto pensando di fare un sondaggio sullo sviluppo each 1 secondo.

    DownloadManager mgr = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); long id = mgr.enqueue(request); DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById(id); Cursor cursor = mgr.query(q); cursor.moveToFirst(); int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); cursor.close(); 

    Edit:

    Un FileObserver può aiutare con questo. Questo è lo scheletro di uno che ho messo insieme per aiutare a tenere traccia di quali file ha scaricato la nostra applicazione. onStop in un onStop un'attività o servizio e interromperlo in onStop . Combinato con una sincronizzazione manuale dello stato delle cose durante onStart , questo può darti un quadro abbastanza completo di quello che sta succedendo.

    Per i progressi in particolare, guardare per gli events OPEN / CLOSE_WRITE può aiutare a decidere quando avviare / interrompere l'invio di DownloadManager per gli aggiornamenti.

     public class DownloadsObserver extends FileObserver { public static final String LOG_TAG = DownloadsObserver.class.getSimpleName(); private static final int flags = FileObserver.CLOSE_WRITE | FileObserver.OPEN | FileObserver.MODIFY | FileObserver.DELETE | FileObserver.MOVED_FROM; // Received three of these after the delete event while deleting a video through a separate file manager app: // 01-16 15:52:27.627: D/APP(4316): DownloadsObserver: onEvent(1073741856, null) public DownloadsObserver(String path) { super(path, flags); } @Override public void onEvent(int event, String path) { Log.d(LOG_TAG, "onEvent(" + event + ", " + path + ")"); if (path == null) { return; } switch (event) { case FileObserver.CLOSE_WRITE: // Download complete, or paused when wifi is disconnected. Possibly reported more than once in a row. // Useful for noticing when a download has been paused. For completions, register a receiver for // DownloadManager.ACTION_DOWNLOAD_COMPLETE. break; case FileObserver.OPEN: // Called for both read and write modes. // Useful for noticing a download has been started or resumed. break; case FileObserver.DELETE: case FileObserver.MOVED_FROM: // These might come in handy for obvious reasons. break; case FileObserver.MODIFY: // Called very frequently while a download is ongoing (~1 per ms). // This could be used to trigger a progress update, but that should probably be done less often than this. break; } } } 

    L'utilizzo sarebbe qualcosa di simile:

     public class MyActivity extends Activity { private FileObserver fileObserver = new DownloadsObserver( getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath()); @Override protected void onStart() { super.onStart(); fileObserver.startWatching(); syncUpDatabaseWithFileSystem(); } @Override protected void onStop() { fileObserver.stopWatching(); super.onStop(); } } 

    Risulta che l'implementazione di FileObserver su Marshmallow ha un bug. Di conseguenza, FileObserver non segnalerà alcuna modifica di un file scaricato dal download manager. (Le versioni precedenti di Android non hanno questo problema – funziona bene su KitKat.) Fonte

    Per me, il seguente codice (basato su questa risposta ) funziona bene. Sondaggio each secondo – ho provato a dimezzare quell'intervallo, ma senza alcun effetto visibile.

     private static final int PROGRESS_DELAY = 1000; Handler handler = new Handler(); private boolean isProgressCheckerRunning = false; // when the first download starts startProgressChecker(); // when the last download finishes or the Activity is destroyed stopProgressChecker(); /** * Checks download progress. */ private void checkProgress() { DownloadManager.Query query = new DownloadManager.Query(); query.setFilterByStatus(~(DownloadManager.STATUS_FAILED | DownloadManager.STATUS_SUCCESSFUL)); Cursor cursor = downloadManager.query(query); if (!cursor.moveToFirst()) { cursor.close(); return; } do { long reference = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID)); long progress = ursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); // do whatever you need with the progress } while (cursor.moveToNext()); cursor.close(); } /** * Starts watching download progress. * * This method is safe to call multiple times. Starting an already running progress checker is a no-op. */ private void startProgressChecker() { if (!isProgressCheckerRunning) { progressChecker.run(); isProgressCheckerRunning = true; } } /** * Stops watching download progress. */ private void stopProgressChecker() { handler.removeCallbacks(progressChecker); isProgressCheckerRunning = false; } /** * Checks download progress and updates status, then re-schedules itself. */ private Runnable progressChecker = new Runnable() { @Override public void run() { try { checkProgress(); manager.refresh(); } finally { handler.postDelayed(progressChecker, PROGRESS_DELAY); } } }; 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.