Actually this is really simple.
I have already posted an example for how to download a file in this post.
How to Download an image in ANDROID programatically?
This is another one little different with a progressbar included.
Previously I have shown three other methods to upload files to a server.
Check these posts to refer this.
1. Uploading audio, video or image files from Android to server
2. How to Upload Multiple files in one request along with other string parameters in android?
3. ANDROID – Upload an image to a server.
OK We will start now.
This is the file we are going to download.
http://coderzheaven.com/sample_folder/sample_file.png
First we will create a simple layout with a button that will download a file on it’s onClick event.
This is the contents of main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/tv1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Downloading File with ProgressBar Demo From Coderzheaven" /> <Button android:id="@+id/b1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Download File" android:onClick="downloadFile" /> </LinearLayout>
Now we will write the java code to download the file.
Copy this code to your main java file. My file is named “DownloadFileDemo1.java”.
package com.coderzheaven.pack; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class DownloadFileDemo1 extends Activity { ProgressBar pb; Dialog dialog; int downloadedSize = 0; int totalSize = 0; TextView cur_val; String dwnload_file_path = "http://coderzheaven.com/sample_folder/sample_file.png"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button b = (Button) findViewById(R.id.b1); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showProgress(dwnload_file_path); new Thread(new Runnable() { public void run() { downloadFile(); } }).start(); } }); } void downloadFile(){ try { URL url = new URL(dwnload_file_path); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); //connect urlConnection.connect(); //set the path where we want to save the file File SDCardRoot = Environment.getExternalStorageDirectory(); //create a new file, to save the downloaded file File file = new File(SDCardRoot,"downloaded_file.png"); FileOutputStream fileOutput = new FileOutputStream(file); //Stream used for reading the data from the internet InputStream inputStream = urlConnection.getInputStream(); //this is the total size of the file which we are downloading totalSize = urlConnection.getContentLength(); runOnUiThread(new Runnable() { public void run() { pb.setMax(totalSize); } }); //create a buffer... byte[] buffer = new byte[1024]; int bufferLength = 0; while ( (bufferLength = inputStream.read(buffer)) > 0 ) { fileOutput.write(buffer, 0, bufferLength); downloadedSize += bufferLength; // update the progressbar // runOnUiThread(new Runnable() { public void run() { pb.setProgress(downloadedSize); float per = ((float)downloadedSize/totalSize) * 100; cur_val.setText("Downloaded " + downloadedSize + "KB / " + totalSize + "KB (" + (int)per + "%)" ); } }); } //close the output stream when complete // fileOutput.close(); runOnUiThread(new Runnable() { public void run() { // pb.dismiss(); // if you want close it.. } }); } catch (final MalformedURLException e) { showError("Error : MalformedURLException " + e); e.printStackTrace(); } catch (final IOException e) { showError("Error : IOException " + e); e.printStackTrace(); } catch (final Exception e) { showError("Error : Please check your internet connection " + e); } } void showError(final String err){ runOnUiThread(new Runnable() { public void run() { Toast.makeText(DownloadFileDemo1.this, err, Toast.LENGTH_LONG).show(); } }); } void showProgress(String file_path){ dialog = new Dialog(DownloadFileDemo1.this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.myprogressdialog); dialog.setTitle("Download Progress"); TextView text = (TextView) dialog.findViewById(R.id.tv1); text.setText("Downloading file from ... " + file_path); cur_val = (TextView) dialog.findViewById(R.id.cur_pg_tv); cur_val.setText("Starting download..."); dialog.show(); pb = (ProgressBar)dialog.findViewById(R.id.progress_bar); pb.setProgress(0); pb.setProgressDrawable(getResources().getDrawable(R.drawable.green_progress)); } }
OK now we have to make a layout for the progressdialog since it is a custom one.
create a new xml file inside res/layout folder and name it myprogressdialog.xml and copy this code into it.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout_root" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" > <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFF" android:text="hello" android:textStyle="bold" /> <TextView android:id="@+id/cur_pg_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#0F0" android:text="hello" android:layout_marginTop="5dp" android:textStyle="bold|italic" /> <ProgressBar android:id="@+id/progress_bar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:progress="0" android:layout_marginTop="5dp" android:layout_marginBottom="10dp" style="?android:attr/progressBarStyleHorizontal" android:maxHeight="10dip" android:minHeight="10dip" /> </LinearLayout>
Now create a new file inside res/drawable folder and name it “green_progress.xml” and copy this code into it.
This xml is used for giving a green color to the progressbar.
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ff9d9e9d" android:centerColor="#ff5a5d5a" android:centerY="0.75" android:endColor="#ff747674" android:angle="270" /> </shape> </item> <item android:id="@android:id/progress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="@color/greenStart" android:centerColor="@color/greenMid" android:centerY="0.75" android:endColor="@color/greenEnd" android:angle="270" /> </shape> </clip> </item> </layer-list>
OK now we have customized the progressbar.
This line sets the progressbar to green color.
pb.setProgressDrawable(getResources().getDrawable(R.drawable.green_progress));
The showProgress() method inside the java code will invoke the custom progressbar.
Now the main thing..
Dont forget to add the permissions to the manifest file.
These two are the permissions we need .
This is the AndroidManifest file for this example.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.coderzheaven.pack" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".DownloadFileDemo1" 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>
The file will be downloaded to the sdcard root. Please go to the DDMS perpective and open the File Explorer and expand the SDCARD to see the downloaded file.
Check the screen shot above.
You can download the complete Eclipse Android Source Code from here.
This is my first time go to see at here and
i am truly happy to read all at single place.
I get this error:
java.io.FileNotFoundException: /mnt/sdcard/downloaded_file.png: open failed: EACCES (Permission denied)
Help…
Did you add the WRITE_EXTERNAL_STORAGE Permission in the manifest.
The error I get is: IOException:UnknownHostException
How do I resolve this ??
Your file URL is incorrect, please check it in a browser first.
Pingback: download and open PDF file on android : Android Community - For Application Development
The error I get is: conn.getContentLength() = -1
How do I resolve this ??
So your image url is incorrect, please check it in a browser first.
Sir how to download whole folder at once
I am new to android i want to download whole folder which contain several videos
You cannot download a complete folder at once, download each file inside the folder and create a folder with same name and write the files inside that folder. that server the purpose.
Hi
I get this when I clicked the Download File button
Error: IOException java.io.FileNotFoundException: /mnt/sdcard/downloaded_file.png: open failed: EACCES (Permission denied)
I have added the permission in manifest but I still get this error
Could you help me?
Sir, Is there any other option for storage except sdcard??
How to implement that?if any..
You can store it in the internal storage in the application sandbox. change SDCARD path to /data/data/your_package_name.
what can I do to download the image from my localhost instead of from a remote server ???
Change your server IP to 10.0.0.2 and put code in your localhost folder.
Thanks for the tutorial,James.
It is very useful for a beginner like me.
I would like to download many photos instead of a single photo.
Would you mind teaching me how to make it?
It will be a great help for me if you can provide the code to me.
Thanks a lot!
I/O Exception while downloading image.jpg.
I already checked url of image using browser also checked permission in Manifest file still show me same error.
Please reply
Pingback: How to download a file to your android device from a remote server with a custom progressbar showing progress? | nileshtpatil
Thank Q very much, wonderful tutorial.
where will be file stored after download,,please guide me,i am using android studio.
You can set the download path in the code itself.
Hello,
Thank you so much Its help me a lot a lot !!!
Thanks.
hello, thanks for the great tutorial.
i have a problem, that code works just fine, but the downloaded images will only appear on my phone’s Gallery after i restart the phone. do you know how to overcome this problem? i had tried both saving the images in sdcard and internal storage.
There is no such issue. Try creating a new folder and save inside it.
How to change the save location?
Change it here
File SDCardRoot = Environment.getExternalStorageDirectory();
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
/**
* Checks if the app has permission to write to device storage
*
* If the app does not has permission then the user will be prompted to grant permissions
*
* @param activity
*/
public static void verifyStoragePermissions(Activity activity) {
// Check if we have write permission
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don’t have permission so prompt the user
ActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
}
Pingback: Uploading audio, video or image files from Android to server – CoderzHeaven
Sir, Hoow to download a mp4 Video??
You can download any file type with this code.