15

Sto utilizzando la classe DownloadManager per scaricare un file a livello di programmazione. Tutto funziona bene ma non riesco a ottenere la notifica completata per il download per persistere. Scompare immediatamente una volta completato il download. Ecco il mio codice:Perché la notifica "download completato" scompare sui dispositivi 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); 

Ho visto alcune domande sul web relative a questo, ma non sono riuscito a trovare una soluzione.

risposta

16

DownloadManager non supporta una notifica di completamento su Gingerbread; devi mostrarlo tu stesso

Utilizzare un BroadcastReceiver to detect when the download finishes e mostrare la propria notifica:

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

e registrarlo nel vostro manifesto:

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

Inoltre, setNotificationVisibility è stato aggiunto nel livello di API 11 (Honeycomb) non ICS. Non sono sicuro se il vostro utilizzo della costante ICS è intenzionale o no, ma è possibile modificare il codice di seguito per l'utilizzo del sistema di notifica su Honeycomb così:

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

Bene, su quale versione stai testando? L'impostazione di VISIBILITY_VISIBLE_NOTIFY_COMPLETED dovrebbe impostare la notifica in modo che venga visualizzata solo al termine del download. Se la notifica viene visualizzata durante il download, allora devo presumere che tu stia correndo su una piattaforma precedente a ICS. Effettuerò il debug dell'applicazione. Imposta i punti di interruzione per vedere quale delle tue scelte "se" è in esecuzione.

+0

Su ICS e dispositivi più recenti, la notifica viene visualizzata correttamente - sia durante il download sia dopo il download. Su Gingerbread e dispositivi precedenti, viene visualizzato durante il download ma scompare quando completato. Non c'è niente della documentazione per sviluppatori su questo. Non ho visto la necessità di inserire punti di interruzione perché ho provato a rimuovere l'istruzione 'if' e ad eseguirla su un emulatore Gingebread. Il codice viene eseguito e la notifica viene visualizzata durante il download, ma il gioco è fatto. –

0

Forse è un modo approssimativo (ma semplice): si può preferire solo per creare una nuova notifica dopo il download è finito PS: ah, e mi dispiace, non è in realtà una risposta alla domanda "perché", ma potrebbe comunque esserti utile

2

È necessario creare il proprio scarica la notifica completa per Gingerbread.

primo luogo, ottenere un riferimento al download dal DownloadManager:

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

poi ascoltare per il dowload completa trasmissione nella vostra abitudine 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); 

e inviare il proprio download completo di notifica .

+0

L'avvertenza con questo approccio è che BroadcastReceiver sarà legato al ciclo di vita delle attività. Meglio usare un [manifest registered receiver] (http://stackoverflow.com/a/13824306/80425) per aumentare la notifica. –

+0

@DavidCaunt. Buon punto, coperto nella tua risposta. Ho fatto +1. –