Ответ 1
Вы можете создать настраиваемое уведомление, а не только уведомление по умолчанию заголовка и подзаголовка.
Что вы хотите здесь: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView
Я хочу, чтобы мое приложение загрузило изображение на веб-сервер. Эта часть работает.
Мне интересно, возможно ли каким-либо образом показать ход загрузки, введя запись в "панель уведомлений". Я вижу, что приложение Facebook делает это.
Когда вы делаете снимок и выбираете загрузку, приложение позволяет продолжить и как-то помещает уведомления о загрузке изображения в индикатор выполнения на панели уведомлений. Я думаю, что симпатичный пятно. Я предполагаю, что они порождают новую услугу или что-то подобное, чтобы обрабатывать загрузку и обновлять этот индикатор выполнения в панели уведомлений так часто.
Спасибо за любые идеи
Вы можете создать настраиваемое уведомление, а не только уведомление по умолчанию заголовка и подзаголовка.
Что вы хотите здесь: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView
В Android, чтобы отобразить индикатор выполнения в Notification, вам просто нужно инициализировать setProgress (...) в Notification.Builder.
Обратите внимание, что в вашем случае вы, вероятно, захотите использовать флаг setOngoing (true).
Integer notificationID = 100;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//Set notification information:
Notification.Builder notificationBuilder = new Notification.Builder(getApplicationContext());
notificationBuilder.setOngoing(true)
.setContentTitle("Notification Content Title")
.setContentText("Notification Content Text")
.setProgress(100, 0, false);
//Send the notification:
Notification notification = notificationBuilder.build();
notificationManager.notify(notificationID, notification);
Затем ваша Служба должна будет сообщить о прогрессе. Предполагая, что вы сохраняете свой процентный прогресс в Integer прогресс (например, progress = 10):
//Update notification information:
notificationBuilder.setProgress(100, progress, false);
//Send the notification:
notification = notificationBuilder.build();
notificationManager.notify(notificationID, notification);
Дополнительную информацию вы можете найти на странице уведомлений API: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#Progress
Я не пользователь Facebook, поэтому я не знаю точно, что вы видите.
Конечно, можно обновить Notification
, изменив значок, чтобы отразить завершенный прогресс. Как вы подозреваете, вы сделали бы это с помощью Service
с фоновым потоком, который управляет загрузкой.
Вы можете попробовать этот класс, это поможет вам генерировать уведомление
public class FileUploadNotification {
public static NotificationManager mNotificationManager;
static NotificationCompat.Builder builder;
static Context context;
static int NOTIFICATION_ID = 111;
static FileUploadNotification fileUploadNotification;
/*public static FileUploadNotification createInsance(Context context) {
if(fileUploadNotification == null)
fileUploadNotification = new FileUploadNotification(context);
return fileUploadNotification;
}*/
public FileUploadNotification(Context context) {
mNotificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
builder = new NotificationCompat.Builder(context);
builder.setContentTitle("start uploading...")
.setContentText("file name")
.setSmallIcon(android.R.drawable.stat_sys_upload)
.setProgress(100, 0, false)
.setAutoCancel(false);
}
public static void updateNotification(String percent, String fileName, String contentText) {
try {
builder.setContentText(contentText)
.setContentTitle(fileName)
//.setSmallIcon(android.R.drawable.stat_sys_download)
.setOngoing(true)
.setContentInfo(percent + "%")
.setProgress(100, Integer.parseInt(percent), false);
mNotificationManager.notify(NOTIFICATION_ID, builder.build());
if (Integer.parseInt(percent) == 100)
deleteNotification();
} catch (Exception e) {
// TODO Auto-generated catch block
Log.e("Error...Notification.", e.getMessage() + ".....");
e.printStackTrace();
}
}
public static void failUploadNotification(/*int percentage, String fileName*/) {
Log.e("downloadsize", "failed notification...");
if (builder != null) {
/* if (percentage < 100) {*/
builder.setContentText("Uploading Failed")
//.setContentTitle(fileName)
.setSmallIcon(android.R.drawable.stat_sys_upload_done)
.setOngoing(false);
mNotificationManager.notify(NOTIFICATION_ID, builder.build());
/*} else {
mNotificationManager.cancel(NOTIFICATION_ID);
builder = null;
}*/
} else {
mNotificationManager.cancel(NOTIFICATION_ID);
}
}
public static void deleteNotification() {
mNotificationManager.cancel(NOTIFICATION_ID);
builder = null;
}
}
Вы эту библиотеку и наслаждайтесь..! проверьте пример для более подробной информации.
открытый класс loadVideo расширяет AsyncTask {
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);
}
}
проверьте это, если это поможет u