我必须使用 android 服务从 url 下载图像文件。该文件已下载,但是当我尝试在通知中添加进度条以便我可以看到我的设备挂起的下载进度或一段时间进度条继续运行并且没有下载文件时。我怎样才能实现?
编码 Android 服务以下载文件并在通知中显示进度条
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();
}
}