Почему уведомление о загрузке завершено на устройствах Gingerbread?
Я использую класс 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);
Я видел некоторые вопросы в Интернете, связанные с этим, но я не мог найти решение.
Ответы
Ответ 1
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);
}
Ответ 2
Вам нужно создать свое собственное полное уведомление о загрузке Gingerbread.
Сначала сделайте ссылку на загрузку с DownloadManager
:
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new Request(someUri);
//...
long downloadReference = downloadManager.enqueue(request);
Затем прослушайте полную трансляцию dowload в своем пользовательском 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);
и отправьте свое собственное полное уведомление о загрузке.
Ответ 3
Ну, в какую версию вы тестируете? Установка VISIBILITY_VISIBLE_NOTIFY_COMPLETED должна устанавливать уведомление, чтобы оно отображалось только после завершения загрузки. Если уведомление появляется во время загрузки, я должен предположить, что вы работаете на платформе, предшествующей ICS. Я бы отлаживал приложение. Установите точки останова, чтобы увидеть, какой из ваших вариантов "if" выполняется.
Ответ 4
Возможно, это грубый (но простой) способ: вы можете предпочесть просто создать новое уведомление после завершения загрузки P.S.:ah, и мне жаль, на самом деле это не ответ на вопрос "почему", но он все равно может быть полезен для вас.