Haseeb Khan
Haseeb Khan

Reputation: 1040

Android Download Image file from service and show progress bar in notification

I have to download an image file from a url using an android service. The file is downloaded but when i try to add the progress bar in notification so that i can see the download progress my device got hang or some time progress bar is keep on running and no file is downloaded. How can i achieve ?

Code Android Service to Download a file and show progress bar in notification

package com.tutorial.app;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.Thread.State;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.util.ByteArrayBuffer;



import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.widget.ProgressBar;
import android.widget.RemoteViews;


public class DownloadProgress extends IntentService {

    public DownloadProgress() {
        super("");
        // TODO Auto-generated constructor stub
    }
    ProgressBar progressBar;
    private List<Integer> progress = new  ArrayList<Integer>();
    int currentProgress = 5;
//    Notification notification;
//    NotificationManager notificationManager;
    String filepath = "/mnt/sdcard/downloaf/first.jpg";



    @Override
    protected void onHandleIntent(Intent intent1) {

    try {
        UpdateProgress();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
    }

    private void UpdateProgress() throws IOException {
        Thread download = null;
        Intent intent = new Intent(this, DownloadProgress.class);
        final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
        @SuppressWarnings("deprecation")
        final Notification notification = new Notification(R.drawable.icon, "simulating a download", System
                .currentTimeMillis());
        notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
        notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.download_progress);
        notification.contentIntent = pendingIntent;
        notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.ic_menu_save);
        notification.contentView.setTextViewText(R.id.status_text, "simulation in progress");
        notification.contentView.setProgressBar(R.id.status_progress, 100, currentProgress, false);
        final NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(
                getApplicationContext().NOTIFICATION_SERVICE);
        notificationManager.notify(42, notification);

        download = new Thread() {

            @Override
            public void run() {

                for (int i = 1; i < 20; i++) {
                    currentProgress ++;//+= (progress.get(i)*10)/100;
                    notification.contentView.setProgressBar(R.id.status_progress, 100, currentProgress, false);

                    // inform the progress bar of updates in progress
                    notificationManager.notify(42, notification);

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

                // remove the notification (we're done)


            }

        };
        URL url = new URL("http://www.ilikewallpaper.net/The-new-iPad-wallpapers/download/4755/Assassins-Creed-3-The-new-iPad-wallpaper-ilikewallpaper_com_1024.jpg");
        File file = new File(filepath);
        URLConnection con = url.openConnection();
        long fileLength = con.getContentLength();
        InputStream stream = con.getInputStream();
        byte[] buff = new byte[5 * 1024];
        BufferedInputStream buffer = new BufferedInputStream(stream,1024*5);
        FileOutputStream outputStream = new FileOutputStream(file);

        int current = 0;

             while ((current = buffer.read()) != -1) {
                    progress.add(current);
                    synchronized (outputStream) {
                        download.run();
                        outputStream.write(buff, 0, current);
                        notificationManager.cancel(42);
                    }


                }



//          download.run();
             outputStream.flush();
        outputStream.close();
        stream.close();






    }


}

Upvotes: 0

Views: 6790

Answers (2)

Zubair Ahmed
Zubair Ahmed

Reputation: 2897

This thread is too old. But I hope someone get help what worked for me.

I've used DownloadManager in android which is added in API level 9. Its very simple to use and you don't need to worry about showing notification. Just few lines of code

DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse("your_any_download_url");
DownloadManager.Request request = new Request(uri);
Long reference = downloadmanager.enqueue(request);

You can read more about DownloadManager from Android Developer Site and follow a tutorial from Here

Upvotes: 0

Nermeen
Nermeen

Reputation: 15973

May be your notifications are too frequent. thats why it freezes. make them update in bigger intervals. Ok is once in every second or 2 seconds.
Check also android memory leak in notification service

Upvotes: 0

Related Questions