15

DownloadManagerクラスを使用して、プログラムでファイルをダウンロードしています。すべて正常に動作しますが、私はダウンロードの完了通知を維持することができません。ダウンロードが完了するとすぐに消えます。私のコードは次のとおりです。Gingerbreadデバイスで「ダウンロードが完了しました」という通知が表示されないのはなぜですか?

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); 

私はこれに関してウェブ上でいくつかの質問を見ましたが、解決策を見つけることができませんでした。

答えて

16

DownloadManagerはGingerbreadの完了通知をサポートしていません。あなた自身でそれを表示する必要があります。

BroadcastReceiver to detect when the download finishesを使用して、独自の通知を表示:

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(ハニカム)ないICSに追加されました。私はICS定数の使用が意図的であるかどうかわからないんだけど、あなたにもハニカム上のシステム通知使用するには、次のようにコードを変更することができます。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
0

どのバージョンをテストしていますか? VISIBILITY_VISIBLE_NOTIFY_COMPLETEDを設定すると、ダウンロードが完了したときにのみ表示されるように通知を設定する必要があります。ダウンロード中に通知が表示される場合は、ICS以前のプラットフォームで実行していると仮定しなければなりません。私はアプリをデバッグするだろう。ブレークポイントを設定して、実行されている「if」の選択肢を確認します。

+0

ICS以降のデバイスでは、ダウンロード時に通知が表示され、ダウンロード後も通知が表示されます。ジンジャーブレッドとそれ以前のデバイスでは、ダウンロード時に表示されますが、完了すると消えます。これに関する開発者のドキュメントは何もありません。私は 'if'文を削除してGingebreadエミュレータで実行しようとしたので、ブレークポイントを入れる必要はありませんでした。コードが実行され、ダウンロード時に通知が表示されますが、それだけです。 –

0

これは大したことではないかもしれませんが、ダウンロードが完了した後に新しい通知を作成するほうがいいかもしれません。 PS:ああ、申し訳ありませんが、実際には「なぜ」という質問に対する回答ではありませんまだあなたのために役立つかもしれません。

2

あなたが独自に作成する必要がありますジンジャーブレッドの完全な通知をダウンロードしてください。

まず、DownloadManagerからダウンロードへの参照を取得します:

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

その後、カスタムBroacastReceiverでdowload完全な放送のために聞く:

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); 

と、独自のダウンロード完了通知をオフに送信。

+0

このアプローチの警告は、BroadcastReceiverがアクティビティライフサイクルに結びつくことです。通知を発行するには、[マニフェスト登録受信者](http://stackoverflow.com/a/13824306/80425)を使用する方がよいでしょう。 –

+0

@DavidCaunt。良い点、あなたの答えで覆われています。私は+1しました。 –

関連する問題