如何在通知区域显示进度条?

6

你好,我正在开发一款与安卓相关的应用程序,其中我需要将视频上传到PHP服务器。
我使用HTTPURLConnection进行上传,但是我遇到了在通知区域显示进度条并更新它的问题。
我已经搜索了近一个星期,但是无法找到任何线索。如果有人知道,请帮助我:

我的代码:

HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead;
        byte[] buffer;
        String urlString = "http://xxxxx/My_path.php";
        try {
            long total = 0;
            int count = 0;
            // ------------------ CLIENT REQUEST
            UUID uniqueKey = UUID.randomUUID();
            fname = uniqueKey.toString();
            Log.e("UNIQUE NAME", fname);
            FileInputStream fileInputStream = new FileInputStream(
                    new File(selectedPath));
            URL url = new URL(urlString);                       
            conn = (HttpURLConnection) url.openConnection();
            int length=selectedPath.length();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type",
                    "multipart/form-data;boundary=" + boundary);
            dos = new DataOutputStream(conn.getOutputStream());
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
                    + fname + "" + lineEnd);
            dos.writeBytes(lineEnd);
            buffer = new byte[8192];
            bytesRead = 0;
            while ((bytesRead = fileInputStream.read(buffer)) > 0) {                                 
                dos.write(buffer, 0, bytesRead);                    
            }           
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);           
            Log.e("Debug", "File is written");
            fileInputStream.close();
            dos.flush();
            dos.close();

        } catch (MalformedURLException ex) {
            Log.e("Debug", "error: " + ex.getMessage(), ex);
        } catch (IOException ioe) {
            Log.e("Debug", "error: " + ioe.getMessage(), ioe);
        }       
        // ------------------ read the SERVER RESPONSE
        try {
            inStream = new DataInputStream(conn.getInputStream());
            String str;
            while ((str = inStream.readLine()) != null) {
                Log.e("Debug", "Server Response " + str);
            }
            inStream.close();

        } catch (IOException ioex) {
            Log.e("Debug", "error: " + ioex.getMessage(), ioex);
        }
3个回答

7

经过长时间的搜索,我完成了在通知区域显示进度条的任务。我们所需要的就是 asynctask。也许我在这里展示的代码不会完美地运行,但我在测试时它能正常工作。如果您发现它很好用,请检查并点赞。

我的代码:

public class loadVideo extends AsyncTask<Void, Integer, Void> {

        int progress = 0;
        Notification notification;
        NotificationManager notificationManager;
        int id = 10;

        protected void onPreExecute() {

        }

        @Override
        protected Void doInBackground(Void... params) {
            HttpURLConnection conn = null;
            DataOutputStream dos = null;
            DataInputStream inStream = null;
            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary = "*****";
            int bytesRead;
            int sentData = 0;               
            byte[] buffer;
            String urlString = "http://xxxxx/xxx/xxxxxx.php";
            try {
                UUID uniqueKey = UUID.randomUUID();
                fname = uniqueKey.toString();
                Log.e("UNIQUE NAME", fname);
                FileInputStream fileInputStream = new FileInputStream(new File(
                        selectedPath));
                int length = fileInputStream.available();
                URL url = new URL(urlString);
                conn = (HttpURLConnection) url.openConnection();
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.setUseCaches(false);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type",
                        "multipart/form-data;boundary=" + boundary);
                dos = new DataOutputStream(conn.getOutputStream());
                dos.writeBytes(twoHyphens + boundary + lineEnd);
                dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
                        + fname + "" + lineEnd);
                dos.writeBytes(lineEnd);
                buffer = new byte[8192];
                bytesRead = 0;
                while ((bytesRead = fileInputStream.read(buffer)) > 0) {
                    dos.write(buffer, 0, bytesRead);
                    sentData += bytesRead;
                    int progress = (int) ((sentData / (float) length) * 100);
                    publishProgress(progress);
                }
                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                Log.e("Debug", "File is written");
                fileInputStream.close();
                dos.flush();
                dos.close();

            } catch (MalformedURLException ex) {
                Log.e("Debug", "error: " + ex.getMessage(), ex);
            } catch (IOException ioe) {
                Log.e("Debug", "error: " + ioe.getMessage(), ioe);
            }
            // ------------------ read the SERVER RESPONSE
            try {
                inStream = new DataInputStream(conn.getInputStream());
                String str;
                while ((str = inStream.readLine()) != null) {
                    Log.e("Debug", "Server Response " + str);
                }
                inStream.close();

            } catch (IOException ioex) {
                Log.e("Debug", "error: " + ioex.getMessage(), ioex);
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {

            Intent intent = new Intent();
            final PendingIntent pendingIntent = PendingIntent.getActivity(
                    getApplicationContext(), 0, intent, 0);
            notification = new Notification(R.drawable.video_upload,
                    "Uploading file", System.currentTimeMillis());
            notification.flags = notification.flags
                    | Notification.FLAG_ONGOING_EVENT;
            notification.contentView = new RemoteViews(getApplicationContext()
                    .getPackageName(), R.layout.upload_progress_bar);
            notification.contentIntent = pendingIntent;
            notification.contentView.setImageViewResource(R.id.status_icon,
                    R.drawable.video_upload);
            notification.contentView.setTextViewText(R.id.status_text,
                    "Uploading...");
            notification.contentView.setProgressBar(R.id.progressBar1, 100,
                    progress[0], false);
            getApplicationContext();
            notificationManager = (NotificationManager) getApplicationContext()
                    .getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(id, notification);
        }

        protected void onPostExecute(Void result) {
            Notification notification = new Notification();
            Intent intent1 = new Intent(MultiThreadActivity.this,
                    MultiThreadActivity.class);
            final PendingIntent pendingIntent = PendingIntent.getActivity(
                    getApplicationContext(), 0, intent1, 0);
            int icon = R.drawable.check_16; // icon from resources
            CharSequence tickerText = "Video Uploaded Successfully"; // ticker-text
            CharSequence contentTitle = getResources().getString(
                    R.string.app_name); // expanded message
            // title
            CharSequence contentText = "Video Uploaded Successfully"; // expanded
                                                                        // message
            long when = System.currentTimeMillis(); // notification time
            Context context = getApplicationContext(); // application
                                                        // Context
            notification = new Notification(icon, tickerText, when);
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
            notification.setLatestEventInfo(context, contentTitle, contentText,
                    pendingIntent);
            String notificationService = Context.NOTIFICATION_SERVICE;
            notificationManager = (NotificationManager) context
                    .getSystemService(notificationService);
            notificationManager.notify(id, notification);
        }
    }

感谢您的来信,此致敬礼。 Sundar


我只是在寻找这个问题的解决方案,我也正在考虑完全相同的做法(根本没有尝试过通知区域进度条)。唯一让我担心的是,当用户改变屏幕方向或离开应用程序时,线程将停止。但是...这不是问题所在,我只是想看看是否有其他人也在使用我考虑的解决方案 :)如果有人有更好的解决方案,请告诉我们 - Honnes

6

使用 setProgress 的方法要简单得多:

public class loadVideo extends AsyncTask<Void, Integer, Void> {

        int progress = 0;
        NotificationCompat.Builder notificationBuilder;
        NotificationManager notificationManager;
        int id = 10;

        protected void onPreExecute() {
            //setup notification
            notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationBuilder  = new NotificationCompat.Builder(getApplicationContext())
                  .setPriority(Notification.PRIORITY_MAX)
                  .setProgress(100,0,false)
                  .setContentTitle("Uploading Video")
                  .setSmallIcon(R.mipmap.ic_launcher)
                  .setContentIntent(pendingIntent)
                  .setAutoCancel(true);

            notificationManager.notify(id,notificationBuilder.build());
        }

        @Override
        protected Void doInBackground(Void... params) {
            //do whatever here
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
          ...
            notificationBuilder.setContentText(""+intProgress+"%");
            notificationBuilder.setProgress(100, intProgress,false);
            notificationManager.notify(id, notificationBuilder.build());
        }

        protected void onPostExecute(Void result) {
            ...
            notificationBuilder.setContentText("Upload Complete");
            notificationManager.notify(1, notificationBuilder.build());
            //continue conquering the world here...
        }
    }

你必须在 doInBackground 中使用 publishProgress(progress_value); 来调用 onProgressUpdate(Integer... progress) - MrinmoyMk

0
在 RemoveView 中,您可以更新进度条。因此,结合一些示例代码,我得到了类似于这样的东西:
public class MyActivity extends Activity {
private static final int PROGRESS = 0x1;
private static final int MAX_PROGRESS = 100;

private int mProgressStatus = 0;

private Handler mHandler = new Handler();

protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    //define Notification
    //...

    RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
    contentView.setProgressBar(R.id.progress_bar, MAX_PROGRESS, mProgressStatus, false);
    notification.contentView = contentView;

    // Start file upload in a background thread
    new Thread(new Runnable() {
        public void run() {
            while (mProgressStatus < MAX_PROGRESS) {
                mProgressStatus = doWork();

                // Update the progress bar
                mHandler.post(new Runnable() {
                    public void run() {
                        contentView.setProgressBar(R.id.progress_bar, MAX_PROGRESS, mProgressStatus, false);
                    }
                });
            }
        }
    }).start();
  }
}

这篇博客文章提供了一个非常好的实现示例。希望这能帮到你。


以上代码引发了空指针异常。你能检查一下代码并让我知道吗? - Manikandan
你有没有查看博客文章?我觉得它会解决你的问题。 - darsh
是的,我看到了博客。但是不知道如何将上传代码与您提到的博客文章同步。 - Manikandan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接