Android从服务下载图像文件并在通知中显示进度条

时间:2012-09-19 07:19:18

标签: android service notifications progress-bar

我必须使用Android服务从网址下载图像文件。该文件已下载,但是当我尝试在通知中添加进度条以便我可以看到下载进度时,我的设备挂起或某个时间进度条继续运行且没有下载文件。我怎样才能实现?

代码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();






    }


}

2 个答案:

答案 0 :(得分:1)

这个帖子太旧了。但我希望有人得到帮助,对我有用。

我在android级别中使用DownloadManager,它在API级别9中添加。它非常易于使用,您无需担心显示通知。只需几行代码

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);

您可以从Android Developer Site了解有关DownloadManager的更多信息,并按照Here的教程

进行操作

答案 1 :(得分:0)

可能是您的通知太频繁了。这就是冻结的原因。让它们以更大的间隔更新。好的是每秒钟或2秒钟一次 另请查看android memory leak in notification service