如何解决前台工作人员中的多个通知
我正在使用工人经理来上传视频以及通知。当用户尝试使用正在进行的上传工作者作业再次上传视频时,即使正在执行工作,第二次上传的通知也不会显示。我正在使用唯一的通知ID,并按here的方式调用setForegroundAsync。我想为提交的每个视频上传作品显示通知。
P.S对不起,我的英语不好。 谢谢
public class PostUploadWorker extends Worker {
private PostDao postDao;
private AppPref appPref;
private HttpLoggingInterceptor logging;
private PostEntity postEntity;
private NotificationManagerCompat notificationManager;
private Bitmap videoThumbnail = null;
public PostUploadWorker(@NonNull Context context,@NonNull WorkerParameters workerParams,@NonNull HttpLoggingInterceptor logging,@NonNull AppPref appPref,@NonNull PostDao postDao) {
super(context,workerParams);
this.logging = logging;
this.appPref = appPref;
this.postDao = postDao;
this.notificationManager = NotificationManagerCompat.from(getApplicationContext());
}
@NonNull
@Override
public Result doWork() {
// Inject fields
long postId = getInputData().getLong(Constants.INTENT_POST_ID,-1);
// upload post
if (postId != -1) {
postEntity = postDao.getPost(postId);
File videoFile = new File(postEntity.getStoragePath());
if (postEntity.getStoragePath() != null && videoFile.exists()) {
if (postEntity != null && !(postEntity.getPostStatus().equals(PostStatus.PROCESSING) || postEntity.getPostStatus().equals(PostStatus.COMPLETED))) {
try {
setForegroundAsync(createForegroundInfo(true,(int) postId));
// upload call
Call<VideoUploadResponse> uploadVideo = initRetrofit().uploadVideo(appPref.getAuth().typedToken(),body,map);
try {
Response<VideoUploadResponse> response = uploadVideo.execute();
if (response.isSuccessful() && response.body() != null) {
VideoUploadResponse vidUploadResponse = response.body();
deleteLogFile(postId);
postEntity.setPostStatus(PostStatus.PROCESSING);
postEntity.setEventId(vidUploadResponse.getEventId());
postDao.updatePost(postEntity);
trackPost("worker upload completed",postEntity);
setForegroundAsync(createForegroundInfo(false,(int) postId));
} else {
App.reportError(appPref.getAuth().getUserId(),"uploadVideo",response.code(),uploadVideo.request());
// TODO retry
trackPost("upload worker failed with response code " + response.code() + ";\n" + uploadVideo.request().toString(),postEntity);
return handlePostUploadFailure(postEntity);
}
} catch (IOException e) {
// TODO retry
App.reportError(appPref.getAuth().getUserId(),"",null,uploadVideo.request(),e.fillInStackTrace());
Log.e("PostUploadWorker","Upload Failed with post id: " + postEntity.getId());
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
trackPost("upload worker failed with trace " + ";\n" + sw.toString(),postEntity);
return handlePostUploadFailure(postEntity);
}
} catch (Exception e) {
App.reportError(appPref.getAuth().getUserId(),"uploadWorker",e.fillInStackTrace());
Log.e("PostUploadWorker","Upload Failed with post id: " + postEntity.getId());
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
trackPost("upload worker failed with trace " + ";\n" + sw.toString(),postEntity);
return handlePostUploadFailure(postEntity);
}
}
} else {
postEntity.setPostStatus(PostStatus.UPLOADING_FAILED);
postDao.updatePost(postEntity);
trackPost("upload worker failed. File to upload doesn't exist",postEntity);
return Result.success();
}
}
// Indicate whether the work finished successfully with the Result
if (videoThumbnail != null) videoThumbnail.recycle();
return Result.success();
}
@NonNull
private ForegroundInfo createForegroundInfo(boolean isUnderProgress,int notificationId) {
// Build a notification using bytesRead and contentLength
Context context = getApplicationContext();
String id = context.getString(R.string.uploads_notification_channel_id);
String title = context.getString(R.string.uploads_notification_title);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChannel();
}
if (videoThumbnail == null && postEntity != null) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
videoThumbnail = ThumbnailUtils.createVideoThumbnail(new File(postEntity.getStoragePath()),new Size(200,200),new CancellationSignal());
} else {
videoThumbnail = ThumbnailUtils.createVideoThumbnail(postEntity.getStoragePath(),MediaStore.Images.Thumbnails.MICRO_KIND);
}
} catch (Exception e) {
e.printStackTrace();
}
}
NotificationCompat.Builder notification = new NotificationCompat.Builder(context,id)
.setContentTitle(title)
.setTicker(title);
if (videoThumbnail != null) {
notification.setLargeIcon(videoThumbnail);
}
if (postEntity != null && !TextUtils.isEmpty(postEntity.getTitle())) {
notification.setContentText(postEntity.getTitle());
notification.setStyle(new NotificationCompat.BigTextStyle()
.bigText(postEntity.getTitle()));
}
if (isUnderProgress) {
notification.setProgress(0,true);
notification.setPriority(NotificationCompat.PRIORITY_HIGH);
notification.setOngoing(true);
} else {
notification.setProgress(0,false);
notification.setContentTitle("video posted");
notification.setPriority(NotificationCompat.PRIORITY_MIN);
notification.setOngoing(false);
}
Intent intent = new Intent(getApplicationContext(),SplashActivity.class);
intent.putExtra("id",notificationId);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),notificationId,intent,0);
Notification notification1 = notification
.setSmallIcon(R.drawable.ic_logo_remush)
.setContentIntent(pendingIntent)
.build();
return new ForegroundInfo(notificationId,notification1,1);
}
@RequiresApi(Build.VERSION_CODES.O)
private void createChannel() {
// Create a Notification channel
CharSequence name = "post uploads";
String description = "post uploads";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel("uploads",name,importance);
channel.setDescription(description);
channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
notificationManager.createNotificationChannel(channel);
}
private Result handlePostUploadFailure(PostEntity postEntity) {
// retry until 5 tries reached
if (postEntity.getUploadRetry() <= 5) {
postEntity.setUploadRetry(postEntity.getUploadRetry() + 1);
postDao.updatePost(postEntity);
return Result.retry();
} else {
// update failed status
postEntity.setPostStatus(PostStatus.UPLOADING_FAILED);
postDao.updatePost(postEntity);
return Result.failure();
}
}
@Override
public void onStopped() {
if (postEntity != null) trackPost("upload worker stopped",postEntity);
if (videoThumbnail != null) videoThumbnail.recycle();
super.onStopped();
}
}
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
WorkRequest postWorkRequest =
new OneTimeWorkRequest.Builder(PostUploadWorker.class)
.setInputData(new Data.Builder()
.putLong(Constants.INTENT_POST_ID,postEntity.getId())
.build())
.setConstraints(constraints)
.addTag("vid_upload_" + postEntity.getId())
.setBackoffCriteria(
BackoffPolicy.LINEAR,10L,TimeUnit.SECONDS)
.build();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。