Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does the "download completed" notification disappear on Gingerbread devices?

I'm using the DownloadManager class to programatically download a file. All works fine but I can't get the download completed notifcation to persist. It disappears immediately once the download has completed. Here's my code:

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

I've seen some questions around the web relating to this but I couldn't find a solution.

like image 758
Mridang Agarwalla Avatar asked Nov 12 '12 19:11

Mridang Agarwalla


2 Answers

DownloadManager doesn't support a completion notification on Gingerbread; you have to display it yourself.

Use a BroadcastReceiver to detect when the download finishes and show your own notification:

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
        }
    }
}

and register it in your manifest:

<receiver android:name="com.zolmo.twentymm.receivers.DownloadBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
    </intent-filter>
</receiver>

Also, setNotificationVisibility was added in API level 11 (Honeycomb) not ICS. I'm not sure if your use of the ICS constant is deliberate or not, but you can change your code to the following to the use the system notification on Honeycomb as well:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    rqtRequest.setShowRunningNotification(true);  
} else {
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
like image 198
David Snabel-Caunt Avatar answered Sep 18 '22 10:09

David Snabel-Caunt


You have to create your own download complete notification for Gingerbread.

First, get a reference to the download from the DownloadManager:

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

Then listen for the dowload complete broadcast in your custom 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);

and send off your own download complete notification.

like image 28
onosendai Avatar answered Sep 20 '22 10:09

onosendai