Menus

Tuesday 29 October 2019

Download File From Server in Android


How to Download an image in ANDROID programatically?

How to Download an pdf in ANDROID programatically?



Open new project and add these code.
This an simple example for downloading files from server in android programatically.

The java code to download the file.
MainActivity.java

package com.example.root.download;

import android.os.AsyncTask;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

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;

public class MainActivity extends AppCompatActivity {

    private static Button btnDownload;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnDownload = (Button) findViewById(R.id.btnDownload);
        btnDownload.setOnClickListener(new View.OnClickListener() {

        @Override
         public void onClick(View view) {

                //ok calll downloading
                new Downloading().execute();

                Toast.makeText(MainActivity.this,"Downloading             completed",Toast.LENGTH_LONG).show();
            }
        });

    }


    //add downloading
    private class Downloading extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {

            try {
             
               //This is the file we are going to download.
               //Please add your server file location .
                URL url = new URL("http://www.mission2win.in/pdf/pdf22.pdf");
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                urlConnection.setRequestMethod("GET");
                urlConnection.setDoOutput(true);

                //Connect
                urlConnection.connect();

                //set path where to save the file
                File SDCardRoot = Environment.getExternalStorageDirectory();
                //create a new file to save
                File file = new File(SDCardRoot,"pdf22.pdf");

                FileOutputStream fileOutput = new FileOutputStream(file);

                //stream used for reading the data from the internet
                InputStream inputStream = urlConnection.getInputStream();


                //create a buffer
                byte[] buffer = new byte[124];
                int bufferLength = 0;


                while( (bufferLength = inputStream.read(buffer)) > 0){
                    fileOutput.write(buffer,0,bufferLength);
                }

                //close the output stream when complete
                fileOutput.close();

            }
            catch (final MalformedURLException e){
                showError("Error : MalformURLException " + 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);
            }

            return null;
        }

        void showError(final String err){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this,err,Toast.LENGTH_LONG).show();
                }
            });
        }

    }
}


This is the contents of xml file.
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.root.download.MainActivity">

    <Button
        android:id="@+id/btnDownload"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Download File"
        />

</RelativeLayout>


Add Internet and Write to External Directory permissions to AndroidManifest.xml
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.root.download">

    <!-- Permission required for Downloading Files -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Permission required for Checking Internet Connection -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- Permission required for Reading Writing SD Card/Memory -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 Now run the app on your Android device.






open failed: EACCES (Permission denied)

Verify permission and add this code to give a permission

 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
            );
        }
    }


Other wise add several permission to Manifest file.

<!-- Permission required for Downloading Files -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- Permission required for Checking Internet Connection -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- Permission required for Reading Writing SD Card/Memory -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />






Android download a file from remote server With progressbar 


Create a new xml file inside res/layout folder and name it progressdialog.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"
    android:padding="10dp"
    >

    <TextView
        android:id="@+id/heading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#0F0"
        android:text="Heading"
        android:textStyle="bold|italic"
        android:layout_marginTop="5dp"

        />

    <ProgressBar
        android:id="@+id/progressbar"
        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>


Colored code add to Main_Activity.java

package com.example.root.download;

import android.app.Dialog;
import android.os.AsyncTask;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

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;

public class MainActivity extends AppCompatActivity {

    private static Button btnDownload;

    ProgressBar progressBar;
    Dialog dialog;
    int downloadedSize =0;
    int totalSize=0;
    TextView heading;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        btnDownload = (Button) findViewById(R.id.btnDownload);

        btnDownload.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {


                showProgress();
                //ok calll downloading
                new Downloading().execute();

                Toast.makeText(MainActivity.this,"Downloading completed",Toast.LENGTH_LONG).show();

            }
        });


    }


    //add downloading
    private class Downloading extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {

            try {

                URL url = new URL("http://www.mission2win.in/pdf/pdf22.pdf");
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                urlConnection.setRequestMethod("GET");
                urlConnection.setDoOutput(true);

                //Connect
                urlConnection.connect();

                //set path where to save the file
                File SDCardRoot = Environment.getExternalStorageDirectory();
                //create a new file to save
                File file = new File(SDCardRoot,"pdf22.pdf");

                FileOutputStream fileOutput = new FileOutputStream(file);

                //stream used for reading the data from the internet
                InputStream inputStream = urlConnection.getInputStream();

                //This is total size of the downloading file
                totalSize = urlConnection.getContentLength();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        progressBar.setMax(totalSize);
                    }
                });


                //create a buffer
                byte[] buffer = new byte[124];
                int bufferLength = 0;


                while( (bufferLength = inputStream.read(buffer)) > 0){
                    fileOutput.write(buffer,0,bufferLength);
                    downloadedSize += bufferLength;
                    //Update progress bar
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progressBar.setProgress(downloadedSize);
                        }
                    });
                }

                //close the output stream when complete
                fileOutput.close();

                //close dialog
                dialog.dismiss();

            }
            catch (final MalformedURLException e){
                showError("Error : MalformURLException " + 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);
            }



            return null;
        }

        void showError(final String err){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(MainActivity.this,err,Toast.LENGTH_LONG).show();
                }
            });
        }


    }



    void showProgress(){
        dialog = new Dialog(MainActivity.this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.progressdialog); //this is my created xml file
        dialog.setTitle("Download Progress");

        heading = (TextView) dialog.findViewById(R.id.heading);
        heading.setText("Download starting ...");
        dialog.show();

        progressBar = (ProgressBar)dialog.findViewById(R.id.progressbar);
        progressBar.setProgress(0);

    }


}