简体   繁体   中英

How to Show download progress in progress bar in Android?

I am using .net web services and I am able to download the file in sd card, But I want to show progress bar when particular file start download and complete and then I want to show options like view and cancel.

Click event Class:

public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
    LazyAdapter ca = (LazyAdapter)parent.getAdapter();
    FolderList item_name = (FolderList)ca.getItem(position);
    FolderList DocumentID = (FolderList)ca.getItem(position);
    FolderList type = (FolderList)ca.getItem(position);

    Intent mIntent = new Intent();  
    mIntent.putExtra("item_name", item_name.folder_name);
    mIntent.putExtra("item_id", DocumentID.ID);
    mIntent.putExtra("item_type", type.type);

    mIntent.getStringExtra("item_name");

    String Type = mIntent.getStringExtra("item_type");

    Log.i("Type", Type);

    if {
       // Some code here...
    } else {
        Intent i = new Intent(getApplicationContext(), Display_image.class);
        i.putExtra("item_name", item_name.folder_name);
        i.putExtra("ID", DocumentID.ID);
        i.putExtra("item_type", type.type);
        i.putExtra("User_ID",User_ID);

        i.getStringExtra("item_name");
        Id = i.getStringExtra("ID");
        i.getStringExtra("item_type");
        startActivity(i);
    }
}

My Code: I want to use download manager

    SoapPrimitive DocumentResponse = (SoapPrimitive)Envelope.getResponse();
        Log.i("DocumentResponse", DocumentResponse.toString());

        String DocAsString = DocumentResponse.toString();

        byte[] decodedString = Base64.decode(DocAsString, Base64.DEFAULT);

         File direct = new File(Environment.getExternalStorageDirectory() + "/MyFolder");

         if(!direct.exists())
         {
           direct.mkdir();
         }
        File photo = new File(Environment.getExternalStorageDirectory() + "/MyFolder", Name);

         if (photo.exists())
         {
           photo.delete();
         }
     try {

         DownloadManager.Request request = new DownloadManager.Request(Uri.parse(Name));
         request.setDescription("Have Fun ;)");
         request.setTitle("Downloading...");
         // 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);
         }

       FileOutputStream fos=new FileOutputStream(photo.getPath());
       fos.write(decodedString);
       fos.close();

       DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
       manager.enqueue(request);

       ContentValues values= new ContentValues();

       System.out.println(values);

     }
     catch (java.io.IOException e) 
     {
       Log.e("PictureDemo", "Exception in photoCallback", e);
     }
    } 

Please suggest how to use download manager into it??? thanks

You could use a ProgressBar to accomplish this.

First, add a progressbar to your interface like this:

<ProgressBar
    android:id="@+id/progress_bar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@android:style/Widget.ProgressBar.Small"/>

Then in your code update your method like this:

protected ProgressBar mProgressBar;
protected long downloadId;
protected DownloadManager manager;

public void startdownload() {
    //<SET UP DOWNLOAD MANAGER HERE>
    downloadId = manager.enqueue(request);
    mProgressBar = findViewById(R.id.progress_bar);
    Timer myTimer = new Timer();
    myTimer.schedule(new TimerTask() {          
        @Override
            public void run() {
            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));
            cursor.close();
            int dl_progress = (bytesDownloaded * 1f / bytesTotal) * 100;
            runOnUiThread(new Runnable(){
                @Override
                public void run(){
                    mProgressbar.setProgress((int) dl_progress);
                }
            });    
        }
    }, 0, 10);
}

Use Follow Method

private NotificationManager mNotifyManager;

case R.id.btnSubmit:
mNotifyManager = (NotificationManager)            context.getSystemService(Context.NOTIFICATION_SERVICE);
            mBuilder = new NotificationCompat.Builder(context);
            mBuilder.setContentTitle("BuyMixTapes")
                    .setContentText("Download in progress")
                    .setSmallIcon(R.drawable.appiconmain);

new DownloadFile().execute(vv);
public class DownloadFile extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread
     * Show Progress Bar Dialog
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //context.showDialog(progress_bar_type);

        mBuilder.setProgress(100, 0, false);
        mNotifyManager.notify(id, mBuilder.build());
    }


    protected String doInBackground(String... f_url) {
        int count;
        try {
            for (int i = 0; i < f_url.length; i++) {
                Log.e("0url",""+f_url[0]);
                Log.e("1url",""+f_url[1]);
               // Log.e("1url",""+f_url[1]);
                URL url = new URL(f_url[i]);
                URLConnection conection = url.openConnection();
                conection.connect();
                // getting file length
                int lenghtOfFile = conection.getContentLength();

                // input stream to read file - with 8k buffer
                InputStream input = new         BufferedInputStream(url.openStream(), 8192);

                // Output stream to write file
                //   OutputStream output = new FileOutputStream("/sdcard/"+f_url[i]);
                OutputStream output = new FileOutputStream(
                        "/sdcard/" +i + "buymix.mp3");
                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    // publishing the progress....
                    // After this onProgressUpdate will be called
                    publishProgress("" + (int) ((total * 100) / lenghtOfFile));

                    // writing data to file
                    output.write(data, 0, count);
                }


                // flushing output
                output.flush();

                // closing streams
                output.close();
                input.close();
            }
        } catch (Exception e) {
            Log.e("Error: ", e.getMessage());
        }

        return null;
    }

    /**
     * Updating progress bar
     */

    /**
     * After completing background task
     * Dismiss the progress dialog
     **/
    @Override
    protected void onProgressUpdate(String... values) {
        // Update progress
        mBuilder.setProgress(100, Integer.parseInt(values[0]), false);
        mNotifyManager.notify(id, mBuilder.build());
        super.onProgressUpdate(values);
    }

    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        mBuilder.setContentText("Download complete");
        // Removes the progress bar
        String imagePath = Environment.getExternalStorageDirectory()
                .toString() + "/downloaded.mp3";
        mBuilder.setProgress(0, 0, false);
        mNotifyManager.notify(id, mBuilder.build());
    }

}

Update 2021:

在此处输入图片说明

Add a ProgressBar in your layout (TextView is just for showing more information):

        <ProgressBar
           android:id="@+id/progressBar"
           style="?android:attr/progressBarStyleHorizontal"
           android:layout_width="match_parent"
           android:layout_height="wrap_content" />

        <TextView
           android:id="@+id/textView1"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_below="@id/progressBar"
           android:text="Hello World!" />

Then before onCreate:

           DownloadManager downloadManager;
           long downloadReference;
           TextView text1;
           ProgressBar progressBar;
           Timer progressTimer;

Afterwards, in onCreate:

            text1 = (TextView) findViewById(R.id.textView1);
            progressBar = (ProgressBar) findViewById(R.id.progressBar);

Then after setting up download manager:

            // <Some codes which setup download manager>
            downloadReference = downloadManager.enqueue(request); // enqueue a new download

            // update progressbar
            progressTimer = new Timer();
            progressTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    DownloadManager.Query downloadQuery = new DownloadManager.Query();
                    downloadQuery.setFilterById(downloadReference);

                    Cursor cursor = downloadManager.query(downloadQuery);
                    if (cursor.moveToFirst()) { // this "if" is crucial to prevent a kind of error
                        final int downloadedBytes = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                        final int totalBytes = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); // integer is enough for files under 2GB
                        cursor.close();

                        final float downloadProgress = downloadedBytes * 100f / totalBytes;
                        if(downloadProgress > 99.9) // stop repeating timer (it's also useful for error prevention)
                            progressTimer.cancel();

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                text1.setText(downloadedBytes + "\n" + totalBytes + "\n" + downloadProgress + "%");
                                progressBar.setProgress((int) downloadProgress);
                            }
                        });
                    }
                }
            }, 0, 1000);

Some tips:

  • If your file is larger than 2GB, you should use another type instead of int such as double etc.
  • You can stop timer somewhere else for example, in BroadcastReceiver if you have.
  • Task executions is every 1000 milliseconds (every 1 second) which is obviously changable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM