How to Use PRDownloader Library in Android App?

22 Feb, 2022
PRDownloader library is a file downloader library for android. It comes with pause and resumes support while downloading a file. This library is capable of downloading large files from the internet and can download any type of file like image, video, pdf, apk and etc. It provides many features that can help a user to download files from the internet easily and efficiently. With this library, you can also check the status of the downloading using the download id and can perform many other important operations using the download id. This library contains many important methods that give full control to the user to handle the downloading states of the file like pause, cancel, resume, etc. You can make the following Requests with this library:
Pause a download request:
PRDownloader.pause(downloadId);
Cancel a download request:
// Cancel with the download id
PRDownloader.cancel(downloadId);
// The tag can be set to any request and then can be used to cancel the request
PRDownloader.cancel(TAG);
// Cancel all the requests
PRDownloader.cancelAll();
Resume a download request:
PRDownloader.resume(downloadId);
Get status of a download request:
Status status = PRDownloader.getStatus(downloadId);
A sample video is given below to get an idea about what we are going to do in this article. Note that we are going to implement this project using the Java language. 
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Then Enter your App Name in the Name field and select Java from the Language drop-down menu.
Step 2:  Add dependency
To add the dependency navigate to app > Gradle Scripts > gradle.build(Module: app) and add the below dependency in the dependencies section. After adding the dependency sync your project.
implementation 'com.mindorks.android:prdownloader:0.6.0'
Step 3: Add Internet Permission
Navigate to app > manifest > AndroidManifest.xml and add the internet permission.
<uses-permission android:name="android.permission.INTERNET"/>
Step 4: Working with the activity_main.xml file
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file. 
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"    tools:context=".MainActivity">     <!-- EditText to take the url from the user -->    <EditText        android:id="@+id/url_etText"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:hint="@string/type_or_paste_your_url_here" />     <!-- Button to start downloading from file -->    <Button        android:id="@+id/btn_download"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/url_etText"        android:layout_centerHorizontal="true"        android:text="@string/download" />         <!-- linear layout that contains widgets to show information -->    <LinearLayout        android:id="@+id/details_box"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_below="@+id/btn_download"        android:layout_margin="10dp"        android:layout_marginTop="20dp"        android:background="@drawable/box_design_layout"        android:orientation="vertical"        android:padding="10dp"        android:visibility="gone">         <!-- Textview to show the file name -->        <TextView            android:id="@+id/file_name"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/click_on_start_button_to_start_downloading"            android:textSize="20sp"            android:textStyle="bold" />         <!-- progress bar to show the progress of downloading -->        <ProgressBar            android:id="@+id/progress_horizontal"            style="@style/Widget.AppCompat.ProgressBar.Horizontal"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_marginLeft="4dp"            android:layout_marginRight="4dp"            android:progressTint="@color/purple_200"            tools:ignore="UnusedAttribute" />         <!-- textview to show the downloading percentage -->        <TextView            android:id="@+id/downloading_percentage"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_horizontal"            android:textAlignment="center"            android:textSize="12sp"            android:textStyle="bold" />         <!-- this linear layout contains buttons -->        <LinearLayout            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_horizontal"            android:orientation="horizontal"            android:padding="10dp">             <!-- button to start the downloading -->            <Button                android:id="@+id/btn_start"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="@string/start" />             <!-- button to cancel or stop the downloading -->            <Button                android:id="@+id/btn_stop"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="@string/stop" />         </LinearLayout>     </LinearLayout>     <!-- this textview will show the path where         the downloaded file is stored -->    <TextView        android:id="@+id/txt_url"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@+id/details_box"        android:layout_marginTop="10dp"        android:textSize="15sp"        android:textStyle="bold" />     </RelativeLayout>
  
Below is the code for the Strings.xml file
 
XML
<resources>    <string name="app_name">GFG PRDownloader Library</string>    <string name="download">DOWNLOAD</string>    <string name="type_or_paste_your_url_here">Type or Paste Your URL Here</string>    <string name="start">START</string>    <string name="stop">STOP</string>    <string name="click_on_start_button_to_start_downloading">Click on Start Button to Start Downloading</string></resources>
  
Step 5: Designing the box layout
 
Navigate to app > res > drawable > right-click > new > Drawable Resource File and name that file as box_design_layout and add the below code to that file.
 
XML
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"    android:shape="rectangle">     <corners        android:bottomLeftRadius="0dp"        android:bottomRightRadius="0dp"        android:topLeftRadius="0dp"        android:topRightRadius="0dp" />     <stroke        android:width="1dp"        android:color="@android:color/black" />     <solid android:color="@android:color/transparent" />     </shape>
  
Step 6: Create Util class
 
Navigate to app > java > package name > right-click > New >Java class and name that file as Utils.java. Add the below code into Utils.java. Below is the code for Utils.java.
 
Java
import android.content.Context;import android.os.Environment; import androidx.core.content.ContextCompat; import java.io.File;import java.util.Locale; public final class Utils {     private Utils() {     }     public static String getRootDirPath(Context context) {        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {            File file = ContextCompat.getExternalFilesDirs(context.getApplicationContext(), null)[0];            return file.getAbsolutePath();        } else {            return context.getApplicationContext().getFilesDir().getAbsolutePath();        }    }     public static String getProgressDisplayLine(long currentBytes, long totalBytes) {        return getBytesToMBString(currentBytes) + "/" + getBytesToMBString(totalBytes);    }     private static String getBytesToMBString(long bytes) {        return String.format(Locale.ENGLISH, "%.2fMb", bytes / (1024.00 * 1024.00));    }}
  
Step 7: Working with the MainActivity.java
 
Go to the MainActivity.java file and refer to the following code. Below is the code for the MainActivity.java file. Comments are added inside the code to understand the code in more detail.
 
Java
import android.annotation.SuppressLint;import android.os.Bundle;import android.view.View;import android.webkit.URLUtil;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.downloader.Error;import com.downloader.OnCancelListener;import com.downloader.OnDownloadListener;import com.downloader.OnPauseListener;import com.downloader.OnProgressListener;import com.downloader.OnStartOrResumeListener;import com.downloader.PRDownloader;import com.downloader.Progress;import com.downloader.Status; public class MainActivity extends AppCompatActivity {         private EditText editTextUrl;    private String path;    private TextView file_downloaded_path, file_name, downloading_percent;    private ProgressBar progressBar;    private Button btnStart, btnCancel, buttonDownload;    private LinearLayout details;    int downloadID;     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);         // Initializing PRDownloader library        PRDownloader.initialize(this);         // finding edittext by its id        editTextUrl = findViewById(R.id.url_etText);                 // finding button by its id        buttonDownload = findViewById(R.id.btn_download);                 // finding textview by its id        file_downloaded_path = findViewById(R.id.txt_url);                 // finding textview by its id        file_name = findViewById(R.id.file_name);                 // finding progressbar by its id        progressBar = findViewById(R.id.progress_horizontal);                 // finding textview by its id        downloading_percent = findViewById(R.id.downloading_percentage);                 // finding button by its id        btnStart = findViewById(R.id.btn_start);                 // finding button by its id        btnCancel = findViewById(R.id.btn_stop);                 // finding linear layout by its id        details = findViewById(R.id.details_box);         //storing the path of the file        path = Utils.getRootDirPath(this);         // handling onclick event on button        buttonDownload.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                // getting the text from edittext                // and storing it to url variable                String url = editTextUrl.getText().toString().trim();                // setting the visibility of linear layout to visible                details.setVisibility(View.VISIBLE);                // calling method downloadFile passing url as parameter                downloadFile(url);            }        });    }     @SuppressLint("SetTextI18n")    private void downloadFile(final String url) {         // handing click event on start button        // which starts the downloading of the file        btnStart.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                 // checks if the process is already running                if (Status.RUNNING == PRDownloader.getStatus(downloadID)) {                    // pauses the download if                    // user click on pause button                    PRDownloader.pause(downloadID);                    return;                }                 // enabling the start button                btnStart.setEnabled(false);                 // checks if the status is paused                if (Status.PAUSED == PRDownloader.getStatus(downloadID)) {                    // resume the download if download is paused                    PRDownloader.resume(downloadID);                    return;                }                 // getting the filename                String fileName = URLUtil.guessFileName(url, null, null);                                 // setting the file name                file_name.setText("Downloading " + fileName);                 // making the download request                downloadID = PRDownloader.download(url, path, fileName)                        .build()                        .setOnStartOrResumeListener(new OnStartOrResumeListener() {                            @SuppressLint("SetTextI18n")                            @Override                            public void onStartOrResume() {                                progressBar.setIndeterminate(false);                                // enables the start button                                btnStart.setEnabled(true);                                // setting the text of start button to pause                                btnStart.setText("Pause");                                // enabling the stop button                                btnCancel.setEnabled(true);                                Toast.makeText(MainActivity.this, "Downloading started", Toast.LENGTH_SHORT).show();                            }                        })                        .setOnPauseListener(new OnPauseListener() {                            @Override                            public void onPause() {                                // setting the text of start button to resume                                // when the download is in paused state                                btnStart.setText("Resume");                                Toast.makeText(MainActivity.this, "Downloading Paused", Toast.LENGTH_SHORT).show();                            }                        })                        .setOnCancelListener(new OnCancelListener() {                            @Override                            public void onCancel() {                                // resetting the downloadId when                                // the download is cancelled                                downloadID = 0;                                // setting the text of start button to start                                btnStart.setText("Start");                                // disabling the cancel button                                btnCancel.setEnabled(false);                                // resetting the progress bar                                progressBar.setProgress(0);                                // resetting the download percent                                downloading_percent.setText("");                                progressBar.setIndeterminate(false);                                Toast.makeText(MainActivity.this, "Downloading Cancelled", Toast.LENGTH_SHORT).show();                            }                        })                        .setOnProgressListener(new OnProgressListener() {                            @Override                            public void onProgress(Progress progress) {                                // getting the progress of download                                long progressPer = progress.currentBytes * 100 / progress.totalBytes;                                // setting the progress to progressbar                                progressBar.setProgress((int) progressPer);                                // setting the download percent                                downloading_percent.setText(Utils.getProgressDisplayLine(progress.currentBytes, progress.totalBytes));                                progressBar.setIndeterminate(false);                            }                        })                        .start(new OnDownloadListener() {                             @Override                            public void onDownloadComplete() {                                // disabling the start button                                btnStart.setEnabled(false);                                // disabling the cancel button                                btnCancel.setEnabled(false);                                // setting the text completed to start button                                btnStart.setText("Completed");                                // will show the path after the file is downloaded                                file_downloaded_path.setText("File stored at : " + path);                                Toast.makeText(MainActivity.this, "Downloading Completed", Toast.LENGTH_SHORT).show();                            }                             @Override                            public void onError(Error error) {                                // setting the text start                                btnStart.setText("Start");                                // resetting the download percentage                                downloading_percent.setText("0");                                // resetting the progressbar                                progressBar.setProgress(0);                                // resetting the downloadID                                downloadID = 0;                                // enabling the start button                                btnStart.setEnabled(true);                                // disabling the cancel button                                btnCancel.setEnabled(false);                                progressBar.setIndeterminate(false);                                Toast.makeText(MainActivity.this, "Error Occurred", Toast.LENGTH_SHORT).show();                            }                        });                 // handling click event on cancel button                btnCancel.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View view) {                        btnStart.setText("Start");                        // cancels the download                        PRDownloader.cancel(downloadID);                    }                });            }        });    }}
  
Output:
 
 
germanshephered48
kk9826225
Picked
Android
Java
Java
Android
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.