Wednesday, 27 June 2012

Android Download File With Progress Bar

Hi guys! Today we are going to do a script that will show an Android progress bar whiledownloading a file. A progress bar looks good for the user to be notified about the progress of the download.

We will easily use a UI thread with Android AsyncTask. In other terms, we will use a subclassto handle our downloader thread. 

Android Download File With Progress Bar
Our output is something like this

DownloadFile.java

package com.example.downloadfile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;

public class DownloadFile extends Activity {
   
    public static final String LOG_TAG = "Android Downloader by The Code Of A Ninja";
   
    //initialize our progress dialog/bar
    private ProgressDialog mProgressDialog;
    public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
   
    //initialize root directory
    File rootDir = Environment.getExternalStorageDirectory();
   
    //defining file name and url
    public String fileName = "codeofaninja.jpg";
    public String fileURL = "https://lh4.googleusercontent.com/-HiJOyupc-tQ/TgnDx1_HDzI/AAAAAAAAAWo/DEeOtnRimak/s800/DSC04158.JPG";
   
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //setting some display
        setContentView(R.layout.main);
        TextView tv = new TextView(this);
        tv.setText("Android Download File With Progress Bar");
   
        //making sure the download directory exists
        checkAndCreateDirectory("/my_downloads");
       
        //executing the asynctask
        new DownloadFileAsync().execute(fileURL);
    }
 
    //this is our download file asynctask
    class DownloadFileAsync extends AsyncTask<StringString, String> {
       
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
        }

       
        @Override
        protected String doInBackground(String... aurl) {

            try {
                //connecting to url
                URL u = new URL(fileURL);
                HttpURLConnection c = (HttpURLConnection)u.openConnection();
                c.setRequestMethod("GET");
                c.setDoOutput(true);
                c.connect();
               
                //lenghtOfFile is used for calculating download progress
                int lenghtOfFile = c.getContentLength();
               
                //this is where the file will be seen after the download
                FileOutputStream f = new FileOutputStream(newFile(rootDir + "/my_downloads/", fileName));
                //file input is from the url
                InputStream in = c.getInputStream();

                //here's the download code
                byte[] buffer = new byte[1024];
                int len1 = 0;
                long total = 0;
               
                while ((len1 = in.read(buffer)) > 0) {
                    total += len1; //total = total + len1
                    publishProgress("" +(int)((total*100)/lenghtOfFile));
                    f.write(buffer, 0, len1);
                }
                f.close();
               
            } catch (Exception e) {
                Log.d(LOG_TAG, e.getMessage());
            }
           
            return null;
        }
       
        protected void onProgressUpdate(String... progress) {
             Log.d(LOG_TAG,progress[0]);
             mProgressDialog.setProgress(Integer.parseInt(progress[0]));
        }

        @Override
        protected void onPostExecute(String unused) {
            //dismiss the dialog after the file was downloaded
            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        }
    }
   
    //function to verify if directory exists
    public void checkAndCreateDirectory(String dirName){
        File new_dir = new File( rootDir + dirName );
        if( !new_dir.exists() ){
            new_dir.mkdirs();
        }
    }
   
    //our progress bar settings
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case DIALOG_DOWNLOAD_PROGRESS: //we set this to 0
                mProgressDialog = new ProgressDialog(this);
                mProgressDialog.setMessage("Downloading file...");
                mProgressDialog.setIndeterminate(false);
                mProgressDialog.setMax(100);
                mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                mProgressDialog.setCancelable(true);
                mProgressDialog.show();
                return mProgressDialog;
            default:
                return null;
        }
    }
}

And for the AndroidManifest.xml, include the INTERNET and WRITE_EXTERNAL_STORAGE permissions.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.example.downloadfile"
     android:versionCode="1"
     android:versionName="1.0">
     
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     
    <uses-sdk android:minSdkVersion="4" />

    <application android:icon="@drawable/icon"android:label="@string/app_name">
        <activity android:name=".DownloadFile"
                 android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

    </application>
</manifest>

That's it! :)

0 comments:

Post a Comment

Internet-PublicLab. Powered by Blogger.