【问题标题】:Broadcast Receiver for cancel downloading in android用于在android中取消下载的广播接收器
【发布时间】:2017-09-21 20:15:43
【问题描述】:

我已经构建了应用程序,该应用程序使用 DownloadManager 从链接下载文件并在下载时显示进度轮。下载完成后,我发送广播接收器将进度轮更改为下载的图标。

现在面临一个问题,如果我取消从通知托盘下载,我不会收到任何广播,因此进度轮不会停止。

谁能知道我如何获得广播以取消下载?

【问题讨论】:

  • 通知托盘中有“取消”按钮吗?
  • @Lino 我正在使用下载管理器进行下载。取消按钮自动添加到通知托盘中的 android nougat 中。

标签: android android-download-manager


【解决方案1】:

要获取下载过程的事件,您需要将 downloadManager 注册到广播接收器。

    IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
    mContext.registerReceiver(downloadReceiver, filter);

这里,广播接收者是:

   private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        checkDownloadStatus(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1));
    }
};

所以当下载取消或成功下载或任何错误时,您将获得状态。即使您从通知中取消。您可以通过以下方式查看状态:

    private void checkDownloadStatus(long downloadReference) {
    DownloadManager.Query myDownloadQuery = new DownloadManager.Query();
    myDownloadQuery.setFilterById(downloadReference);

//向下载管理器查询已请求的下载。 光标 cursor = downloadManager.query(myDownloadQuery); if (cursor.moveToFirst()) {

        //column for status
        int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
        int status = cursor.getInt(columnIndex);
        //column for reason code if the download failed or paused
        int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);
        int reason = cursor.getInt(columnReason);
        //get the download filename

        String statusText = "";
        String reasonText = "";

        switch (status) {
            case DownloadManager.STATUS_FAILED:
                statusText = "STATUS_FAILED";
                switch (reason) {
                    case DownloadManager.ERROR_CANNOT_RESUME:
                        reasonText = "ERROR_CANNOT_RESUME";
                        break;
                    case DownloadManager.ERROR_DEVICE_NOT_FOUND:
                        reasonText = "ERROR_DEVICE_NOT_FOUND";
                        break;
                    case DownloadManager.ERROR_FILE_ALREADY_EXISTS:
                        reasonText = "ERROR_FILE_ALREADY_EXISTS";
                        break;
                    case DownloadManager.ERROR_FILE_ERROR:
                        reasonText = "ERROR_FILE_ERROR";
                        break;
                    case DownloadManager.ERROR_HTTP_DATA_ERROR:
                        reasonText = "ERROR_HTTP_DATA_ERROR";
                        break;
                    case DownloadManager.ERROR_INSUFFICIENT_SPACE:
                        reasonText = "ERROR_INSUFFICIENT_SPACE";
                        break;
                    case DownloadManager.ERROR_TOO_MANY_REDIRECTS:
                        reasonText = "ERROR_TOO_MANY_REDIRECTS";
                        break;
                    case DownloadManager.ERROR_UNHANDLED_HTTP_CODE:
                        reasonText = "ERROR_UNHANDLED_HTTP_CODE";
                        break;
                    case DownloadManager.ERROR_UNKNOWN:
                        reasonText = "ERROR_UNKNOWN";
                        break;
                }
                break;
            case DownloadManager.STATUS_PAUSED:
                statusText = "STATUS_PAUSED";
                switch (reason) {
                    case DownloadManager.PAUSED_QUEUED_FOR_WIFI:
                        reasonText = "PAUSED_QUEUED_FOR_WIFI";
                        break;
                    case DownloadManager.PAUSED_UNKNOWN:
                        reasonText = "PAUSED_UNKNOWN";
                        break;
                    case DownloadManager.PAUSED_WAITING_FOR_NETWORK:
                        reasonText = "PAUSED_WAITING_FOR_NETWORK";
                        break;
                    case DownloadManager.PAUSED_WAITING_TO_RETRY:
                        reasonText = "PAUSED_WAITING_TO_RETRY";
                        break;
                }
                break;
            case DownloadManager.STATUS_PENDING:
                statusText = "STATUS_PENDING";
                break;
            case DownloadManager.STATUS_RUNNING:
                statusText = "STATUS_RUNNING";
                break;
            case DownloadManager.STATUS_SUCCESSFUL:
                statusText = "STATUS_SUCCESSFUL";

                break;
        }

    }

}

出现错误时,您可以停止进度条。

【讨论】:

  • 我在问题中提到我正在发送广播但它不起作用。
  • 问题在于意图。getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) 将始终返回-1,因为当取消按钮固定时它不存在。我还没有弄清楚如何接收被取消的文件......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多