22

DownloadManager を使用して、アプリケーションで多数のファイルをダウンロードしています。downloadManager によってキューに入れられたダウンロードをキャンセルする方法がわかりません。

次の 2 つの可能性があります。ユーザーは、通知バーでクリックして手動でキャンセルできます。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);

}

洞察はありますか?

4

2 に答える 2

58

DownloadManagerメソッドを呼び出すことで、ダウンロードをキャンセルできますremove(long...)。これには、ダウンロードの ID が必要です。私の経験から、基本的にそれを取得するための信頼できる方法が 2 つあります。

  1. enqueue(DownloadManager.Request)メソッドの戻り値を覚えておいてください。
  2. メソッドDownloadManagerを介してダウンロードを照会します。query(DownloadManager.Query)次に、返された から ID を取得します。ID はCursorという名前の列に格納されますDownloadManager.COLUMN_ID

放送受信機

私の経験から、ダウンロード ID をBroadcastReceiverfor アクション経由で取得することは信頼できませんandroid.intent.action.DOWNLOAD_NOTIFICATION_CLICKED(ただし、ブロードキャストは常に送信されます)。

  1. extra からのダウンロード ID の取得DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDSが正しく機能しません。一部のデバイスでは、常に null を返します。一部のデバイスで何かが返される場合、それは最初に開始されたダウンロードの ID です。また、最初のダウンロードが終了/キャンセルされた場合は、残りのダウンロードの通知のために null を返します。
  2. このアクションでは、extra からの値の取得はDownloadManager.EXTRA_DOWNLOAD_ID機能しません。

アクションのブロードキャストで ID を取得することandroid.intent.action.DOWNLOAD_COMPLETEは信頼できるようです。extra から取得する必要がありますDownloadManager.EXTRA_DOWNLOAD_ID。ブロードキャストは、ダウンロードが完了したときだけでなく、ダウンロード呼び出しをキャンセルしたときにも送信されることに注意してくださいremove()

注: ダウンロードは 1 つの通知にグループ化されることもあれば、複数の通知が作成されることもあります。通知がグループ化される場合とグループ化されない場合の条件を把握できませんでした。OS のバージョン、デバイス、ダウンロード タイトルなどの多くの要因に依存するようで、一般的にはかなり予測できないようです。

注: 他のアプリのダウンロードをキャンセルできるかどうかをテストしましたが、そうではないようです。ただし、ID はすべてのアプリで一意のデータベース ID です。呼び出しremove()によって別のアプリのダウンロードがキャンセルされることはありません。

于 2012-12-30T03:57:41.883 に答える