2016-06-08 2 views
2

Ich verwende den Android-Download-Manager in meiner App. Wie kann ich auf den Fortschritt des Downloads (wie der Prozentsatz des Downloads in der Benachrichtigung) zugreifen, um diesen Prozentsatz in meiner Fortschrittsleiste innerhalb der Aktivität anzuzeigen?Wie kann ich auf den Prozentsatz des Android Download-Managers zugreifen?

Dies ist meine Methode, die die Datei herunterlädt:

//////////////////////////////////////////////////////////// 
//================== btn download set on click listner =========== 
//////////////////////////////////////////////////////////// 

holder.btnDownload.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
     Uri downloadUri = Uri.parse(questionha.get(position).getQuestionDownLink()); 
     if (!Uri.EMPTY.equals(downloadUri)) { 

      Request request = new Request(downloadUri); 
      request.setTitle(questionha.get(position).getQuestionTitle()); 
      request.setDescription("Downloading ...."); 
      request.setDestinationInExternalFilesDir(v.getContext(), "downloaded", questionha.get(position).getQuestionDownFileName()); 
      enqueue = dm.enqueue(request); 
     }else { 
      Log.i("Download manager","Download manager url is null !"); 
     } 

    } 
}); 

Antwort

2

Nachdem im Android Download Manager Doc Suche fand ich diese Lösung:

String urlDownload = "something"; 
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlDownload)); 

request.setDescription("This is Desc"); 
request.setTitle("download picsArt"); 
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 int dl_progress = (int) ((bytes_downloaded * 100l)/bytes_total); 

      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 

        mProgressBar.setProgress((int) dl_progress); 

       } 
      }); 
      cursor.close(); 
     } 

    } 
}).start(); 
+0

den Fortschritt Abfragen in einer engen Schleife falsch anfühlt. –

+0

aber dieser Code funktioniert für mich und aktualisieren Sie die Fortschrittsleiste, was denken Sie? – majid

+0

Ich denke, dass Sie Batterie wahrscheinlich nicht verschwenden, weil Sie diesen Wert ständig überprüfen. Ich weiß nicht, ob das ein Ereignis ist, auf das du hören kannst oder auf andere Weise, aber zumindest würdest du ein bisschen warten wollen, nachdem du die Datenbank abgefragt hast, bis du es wieder tust. –

Verwandte Themen