Search code examples
androidandroid-download-managerandroid-webserviceandroid-statusbar

How to show download in statusBar in Android


I want download file from server, for download i use this code and write below codes:

public class MainActivity extends AppCompatActivity {

    Button download;
    TextView downloadCount;
    ProgressBar progressBar;

    Future<File> downloading;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Enable global Ion logging
        Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);

        setContentView(R.layout.activity_main);

        download = (Button) findViewById(R.id.download);
        downloadCount = (TextView) findViewById(R.id.download_count);
        progressBar = (ProgressBar) findViewById(R.id.progress);

        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File(sdCard.getAbsolutePath() + "/my app");
        if (!dir.exists()) {
            dir.mkdirs();
        }
        final File file = new File(dir, "filename.zip");

        download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (downloading != null && !downloading.isCancelled()) {
                    resetDownload();
                    return;
                }

                download.setText("Cancel");
                // this is a 180MB zip file to test with
                downloading = Ion.with(MainActivity.this)
                        .load("http://cdn.p30download.com/?b=p30dl-software&f=PCWinSoft.1AVMonitor.v1.9.1.50_p30download.com.rar")
                        .progressBar(progressBar)
                        .progressHandler(new ProgressCallback() {
                            @Override
                            public void onProgress(long downloaded, long total) {
                                downloadCount.setText("" + downloaded + " / " + total);
                            }
                        })
                        // write to a file
                        .write(file)
                        // run a callback on completion
                        .setCallback(new FutureCallback<File>() {
                            @Override
                            public void onCompleted(Exception e, File result) {
                                resetDownload();
                                if (e != null) {
                                    Toast.makeText(MainActivity.this, "Error downloading file", Toast.LENGTH_LONG).show();
                                    return;
                                }
                                Toast.makeText(MainActivity.this, "File upload complete", Toast.LENGTH_LONG).show();
                            }
                        });
            }
        });
    }

    void resetDownload() {
        // cancel any pending download
        downloading.cancel();
        downloading = null;

        // reset the ui
        download.setText("Download");
        downloadCount.setText(null);
        progressBar.setProgress(0);
    }
}

I want when click on download button show this download in statusBar! But in my code just show download in progressBar, but i want show download progress in ProgressBar too statusBar!

How can i it? Please help me, i really need this.


Solution

  • You can display a notification with the progress, by changing your code to something like:

    public class MainActivity extends AppCompatActivity {
    
        Button download;
        TextView downloadCount;
        ProgressBar progressBar;
    
        // --- Add these variables
        private NotificationManager mNotifyManager;
        private NotificationCompat.Builder mBuilder;
        // ---
    
        Future<File> downloading;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // Enable global Ion logging
            Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG);
    
            setContentView(R.layout.activity_main);
    
            download = (Button) findViewById(R.id.download);
            downloadCount = (TextView) findViewById(R.id.download_count);
            progressBar = (ProgressBar) findViewById(R.id.progress);
    
            File sdCard = Environment.getExternalStorageDirectory();
            File dir = new File(sdCard.getAbsolutePath() + "/my app");
            if (!dir.exists()) {
                dir.mkdirs();
            }
            final File file = new File(dir, "filename.zip");
    
            download.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (downloading != null && !downloading.isCancelled()) {
                        resetDownload();
                        return;
                    }
    
                    download.setText("Cancel");
    
                    // --- Initialize notification manager and the builder
                    mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                    mBuilder = new NotificationCompat.Builder(this);
                    mBuilder.setContentTitle("Picture Download")
                        .setContentText("Download in progress")
                        .setSmallIcon(R.drawable.ic_launcher);
                    // ---
    
                    // this is a 180MB zip file to test with
                    downloading = Ion.with(MainActivity.this)
                        .load("http://cdn.p30download.com/?b=p30dl-software&f=PCWinSoft.1AVMonitor.v1.9.1.50_p30download.com.rar")
                        .progressBar(progressBar)
                        .progressHandler(new ProgressCallback() {
                            @Override
                            public void onProgress(long downloaded, long total) {
                                downloadCount.setText("" + downloaded + " / " + total);
    
                                // --- Update the progress on the notification
                                mBuilder.setProgress(100, incr, false);
                                mNotifyManager.notify(0, mBuilder.build());
                                // ---
                            }
                        })
                        // write to a file
                        .write(file)
                        // run a callback on completion
                        .setCallback(new FutureCallback<File>() {
                            @Override
                            public void onCompleted(Exception e, File result) {
                                resetDownload();
                                if (e != null) {
                                    Toast.makeText(MainActivity.this, "Error downloading file", Toast.LENGTH_LONG).show();
                                    return;
                                }
                                Toast.makeText(MainActivity.this, "File upload complete", Toast.LENGTH_LONG).show();
                            }
                        });
                            });
                }
            });
        }
    
        void resetDownload() {
            // cancel any pending download
            downloading.cancel();
            downloading = null;
    
            mBuilder.setContentText("Download complete")
            // Removes the progress bar
                    .setProgress(0, 0, false);
            mNotifyManager.notify(ID, mBuilder.build());
    
            // reset the ui
            download.setText("Download");
            downloadCount.setText(null);
            progressBar.setProgress(0);
        }
    }
    

    Read here for information about displaying progress in notification: Displaying Progress in a Notification