5

Hi Iam doing an android aplication in which iam uploading videos to PHP server.
Iam using HTTPURLConnection to do the upload. Iam strucked in showing progress bar in notification area and updating it.
Iam searching almost a week to do this.But can't get a hint.Please help me if anybody knows:

My code:

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);
        }
Manikandan
  • 1,602
  • 4
  • 16
  • 28

3 Answers3

7

After a long search i finished the task of showing progress bar in notification area.All we need is asynctask.May be the code iam showing here will not work perfectly,It works fine when iam testing.Please check and upvote for this answer if it works good.

My code:

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

Thanks and Regards Sundar.

Manikandan
  • 1,602
  • 4
  • 16
  • 28
  • I was just looking for a solution for this, I was thinking about doing exactly the same (havent tried the notification area progress bar at all). The only thing that worries me that the thread will stop when the user changes screen orientation or when leaving the app. But...that's not the issue here, just like to see someone else is using a solution I was thinking of as well :) If someone else got a better solution, please let us know of course – Honnes Sep 16 '12 at 19:23
6

A much simpler way using 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...
        }
    }
Acheme Paul
  • 892
  • 11
  • 16
  • You must use `publishProgress(progress_value);` inside `doInBackground` to call `onProgressUpdate(Integer... progress)` – MrinmoyMk May 15 '20 at 19:13
0

In RemoveView, you can update the Progress bar. So combining some of the example codes, I get something like this:

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

This blog post has a very good example of implementing the same. Hope this helps.

darsh
  • 711
  • 4
  • 9
  • 34