是否可以取消/停止使用DownloadManager开始的下载?

问题描述 投票:21回答:1

我正在使用DownloadManager在我的应用程序中下载一堆文件。我无法弄清楚如何取消downloadManager排队的下载。

有两种可能性:一种。用户可以通过在通知栏中单击它来手动取消它。b。取消并通过代码删除下载。

我定义了以下接收者。

<receiver 
        android:name=".DownloadStatusReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
            <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" />
     </intent-filter>
 </receiver> 

并且在接收器中

if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {

    Constants.showLog(TAG, "Notification clicked");
    long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
    DownloadManager dm =(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);             
    dm.remove(downloadId);

}

任何见解?

android android-download-manager
1个回答
54
投票

您可以通过调用DownloadManager的方法通过remove(long...)取消下载。为此,您需要下载的ID。根据我的经验,基本上有两种可靠的获取方法:

  1. 记住enqueue(DownloadManager.Request)方法的返回值。
  2. 通过DownloadManager方法向query(DownloadManager.Query)查询下载。然后从返回的Cursor中检索ID,它们存储在名为DownloadManager.COLUMN_ID的列中。

广播接收器

根据我的经验,通过动作BroadcastReceiver通过android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED检索下载ID是不可靠的(尽管总是发送广播)。>>

  1. 从额外的DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS获取下载ID无法正常工作。在某些设备上,它始终返回null。如果它在某些设备上返回内容,则它是首先开始的下载的ID。并且,如果第一次下载已完成/取消,它将返回null以通知剩余的下载。
  2. 从额外的DownloadManager.EXTRA_DOWNLOAD_ID获取值不适用于此操作。
  3. 在广播中获取动作android.intent.action.DOWNLOAD_COMPLETE的ID似乎是可靠的。您必须从额外的DownloadManager.EXTRA_DOWNLOAD_ID中获取它。请注意,广播不仅发送完成下载,而​​且在您取消下载呼叫remove()时也发送。

    注意:

下载有时会分组为一个通知,有时会创建多个通知。我无法弄清楚通知是否合并的条件。它似乎取决于操作系统版本,设备,下载标题,...等许多因素,并且总体上似乎是不可预测的。

注意:我已经测试过您是否可以取消其他应用程序的下载,但事实并非如此。即使这些ID是在所有应用程序中唯一的数据库ID。调用remove()不会取消其他应用的下载。


0
投票

请引导我。我们公司为企业高管制作培训视频。我们把这些电影放到了Moodle系统中。问题是任何具有下载管理器的人都可以下载这些视频,而我们的所有工作都被浪费了。是否有任何代码禁止下载管理器进行下载?

© www.soinside.com 2019 - 2024. All rights reserved.