gpt4 book ai didi

android - 调用 setProgress(0, 0, true) 不会更新 > API 19 上的通知

转载 作者:搜寻专家 更新时间:2023-11-01 08:23:04 24 4
gpt4 key购买 nike

更新:

在进行了更多的调试之后,我找出了通知未更新的原因:下载完成后调用 setProgress(0, 0, false)。由于某些原因,当在 notify() 之前调用此方法时,即将到来的更新实际上并没有通过。添加 NotificationChannel 不会执行任何操作。

我目前的解决方法是调用 setProgress(100, 100, false),这样用户就可以知道下载已完成,随后会进行更新。

原始问题:

我有一个自定义文件下载实用程序,它会在下载文件时创建通知。此通知会随着下载的进行而更新。但是,我在 19 以上的 API 级别上得到了一些奇怪的结果。下载完成后,NotificationManager 不会更新通知来通知用户。奇怪的是,每当下载进行时,通知都会更新。此外,当我激活调试器时,通知会在下载完成时更新。这让我相信这里正在发生某种竞争条件,但我似乎无法真正找出发生在何处或如何发生。

我的 FileDownloader 类:

public static void startGetRequestDownload(final Context context,
String fileUrl,
@Nullable String fileName,
@Nullable Header[] headers,
@Nullable RequestParams requestParams,
final boolean showProgressNotification){

final int notificationID = 0;
final NotificationManager mNotifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if(mNotifyManager == null) {
Log.e(TAG, "Failed to get NotificationManager service");
return;
}
final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
String notificationTitle = context.getString(R.string.default_filename);
if(fileName != null && !fileName.isEmpty()){
notificationTitle = fileName;
}
mBuilder.setContentTitle(notificationTitle)
.setContentText(context.getString(R.string.download_in_progress))
.setColor(ContextCompat.getColor(context, R.color.app_color_accent))
.setSmallIcon(R.drawable.ic_elab);

String uuid = "Temp_" + System.currentTimeMillis();
final File tempFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString(), uuid);
// Temporarily disable SSL as workaround.
RestClient.getClient().setSSLSocketFactory(MySSLSocketFactory.getFixedSocketFactory());
RestClient.getClient().get(context, fileUrl, headers, requestParams, new FileAsyncHttpResponseHandler(tempFile) {

@Override
public void onStart() {
super.onStart();
if(showProgressNotification){
mBuilder.setProgress(100, 0, false);
mNotifyManager.notify(notificationID, mBuilder.build());
}
}

@Override
public void onProgress(long bytesWritten, long totalSize) {
super.onProgress(bytesWritten, totalSize);
if(showProgressNotification){
int progress = (int) (bytesWritten / totalSize * 100);
mBuilder.setProgress(100, progress, false);
mNotifyManager.notify(notificationID, mBuilder.build());
}
}

@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {
if(showProgressNotification){
mBuilder.setContentText(context.getString(R.string.download_failed));
mBuilder.setProgress(0,0,false);
mNotifyManager.notify(notificationID, mBuilder.build());
}
Log.w(TAG, "File download failed", throwable);
}

@Override
public void onSuccess(int statusCode, Header[] headers, File file) {
FileMetaData metaData = validateResponse(headers);
if(metaData != null){
final File downloadDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString());
File newFile = new File(downloadDirectory, metaData.fileName);
if(file.renameTo(newFile)){
Uri fileUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", newFile);
Intent actionViewIntent = new Intent(Intent.ACTION_VIEW);
actionViewIntent.setDataAndType(fileUri, metaData.contentType);
actionViewIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

if(showProgressNotification){
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, actionViewIntent, PendingIntent.FLAG_ONE_SHOT);
mBuilder.setProgress(0,0,false);
mBuilder.setContentText(context.getString(R.string.download_completed));
mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(android.R.drawable.stat_sys_download_done);
mNotifyManager.notify(notificationID, mBuilder.build());
}
return;
}
}

//Failover
if(showProgressNotification){
mBuilder.setContentText(context.getString(R.string.download_failed));
mNotifyManager.notify(notificationID, mBuilder.build());
}
}
});
}

最佳答案

我找到了通知未更新的真正原因。 Android 文档在通知更新方面提到了以下内容:

Caution: The system applies a rate limit to updating notifications. If you post updates to a notification too frequently, the system may drop some notifications.

每次下载进行时,我都会调用 notify()。显然,下载进度方法被调用得非常频繁,导致多次通知被屏蔽。但是,我只看到最后一个通知被删除:下载完成通知。

限制 onProgress() 中对 notify() 的调用次数解决了我的问题。

关于android - 调用 setProgress(0, 0, true) 不会更新 > API 19 上的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48336633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com