15

我正在使用DownloadManager该类以编程方式下载文件。一切正常,但我无法让下载完成通知持续存在。下载完成后立即消失。这是我的代码:

Request rqtRequest = new Request(Uri.parse(((URI) vewView.getTag()).toString()));
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
    rqtRequest.setShowRunningNotification(true);  
} else {
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
((DownloadManager) getSystemService(DOWNLOAD_SERVICE)).enqueue(rqtRequest);

我在网上看到了一些与此相关的问题,但我找不到解决方案。

4

4 回答 4

16

DownloadManager不支持 Gingerbread 的完成通知;你必须自己展示它。

使用BroadcastReceiver 检测下载何时完成并显示您自己的通知:

public class DownloadBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            //Show a notification
        }
    }
}

并将其注册到您的清单中:

<receiver android:name="com.zolmo.twentymm.receivers.DownloadBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
    </intent-filter>
</receiver>

此外,setNotificationVisibility在 API 级别 11(Honeycomb)而不是 ICS 中添加。我不确定您是否有意使用 ICS 常量,但您可以将代码更改为以下内容以在 Honeycomb 上使用系统通知:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    rqtRequest.setShowRunningNotification(true);  
} else {
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
于 2012-12-11T16:28:37.373 回答
2

您必须为 Gingerbread 创建自己的下载完成通知。

首先,从以下位置获取对下载的引用DownloadManager

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
DownloadManager.Request request = new Request(someUri); 
//...
long downloadReference = downloadManager.enqueue(request);

然后在您的自定义中收听下载完成广播BroacastReceiver

IntentFilter filter = new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE);

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override public void onReceive( Context context, Intent intent) { 
      long reference = intent.getLongExtra( DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
       if (downloadReference == reference) { 
                // Send your own notification
        } 
     } 
}; 

registerReceiver( receiver, filter);

并发送您自己的下载完成通知。

于 2012-12-12T01:56:14.673 回答
0

好吧,你测试的是哪个版本?设置 VISIBILITY_VISIBLE_NOTIFY_COMPLETED 应该设置通知,以便它仅在下载完成时显示。如果在下载过程中显示通知,那么我必须假设您在 ICS 之前的平台上运行。我会调试应用程序。设置断点以查看正在执行哪些“如果”选项。

于 2012-11-12T20:24:27.283 回答
0

也许这是一种粗略(但简单)的方式:您可能更喜欢在下载完成后创建新通知 PS:啊,对不起,这实际上不是对“为什么”问题的回答,但它仍然可能对你

于 2012-12-11T10:56:20.527 回答