Reputation: 1040
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
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
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