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