web-dev-qa-db-fra.com

Gestionnaire de téléchargement Android terminé

Petite question sur le gestionnaire de téléchargement sous Android ... C'est la première fois que je travaille avec ce logiciel et que j'ai téléchargé plusieurs fichiers et que je les ai ouverts. Mais ma question est de savoir comment vérifier si le téléchargement est terminé.

La situation est que je télécharge un fichier PDF et l’ouvre, et qu’il est si petit qu’il est complet avant l’ouverture. Mais si le fichier est un peu plus gros, comment puis-je vérifier si le gestionnaire de téléchargement a terminé le téléchargement avant de l'ouvrir?.

Comment je télécharge: 

Intent intent = getIntent();
DownloadManager downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
Uri Download_Uri = Uri.parse(intent.getStringExtra("Document_href"));
DownloadManager.Request request = new DownloadManager.Request(Download_Uri);

//Restrict the types of networks over which this download may proceed.
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
//Set whether this download may proceed over a roaming connection.
request.setAllowedOverRoaming(false);
//Set the title of this download, to be displayed in notifications.
request.setTitle(intent.getStringExtra("Document_title"));
//Set the local destination for the downloaded file to a path within the application's external files directory
request.setDestinationInExternalFilesDir(this,Environment.DIRECTORY_DOWNLOADS,intent.getStringExtra("Document_title") + ".pdf");
//Enqueue a new download and same the referenceId
Long downloadReference = downloadManager.enqueue(request);

Comment j'ouvre le fichier

Uri uri = Uri.parse("content://com.app.applicationname/" + "/Download/" + intent.getStringExtra("Document_title") + ".pdf");
Intent target = new Intent(Intent.ACTION_VIEW);
target.setDataAndType(uri, "application/pdf");
target.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(target);

Donc, quelque part entre le téléchargement et l’ouverture du fichier, je veux une instruction if pour vérifier si elle doit continuer ou attendre pour le fichier.

37
Msmit1993

Une action d'intention de diffusion envoyée par le gestionnaire de téléchargement une fois le téléchargement terminé. Vous devez donc enregistrer un récepteur pour la fin du téléchargement:

Pour enregistrer le destinataire 

registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

et un gestionnaire BroadcastReciever

BroadcastReceiver onComplete=new BroadcastReceiver() {
    public void onReceive(Context ctxt, Intent intent) {
        // your code
    }
};

Vous pouvez également créer AsyncTask pour gérer le téléchargement de gros fichiers

Créez une boîte de dialogue de téléchargement pour afficher le téléchargement dans la zone de notification et gérer l'ouverture du fichier:

protected void openFile(String fileName) {
    Intent install = new Intent(Intent.ACTION_VIEW);
    install.setDataAndType(Uri.fromFile(new File(fileName)),"MIME-TYPE");
    startActivity(install);
}

vous pouvez également consulter le lien de l'échantillon

Exemple de code

63
Vaibhav Agarwal

Courtoisie: exemple Android DonwnloadManager

La réponse acceptée n'est pas complètement correcte. La réception de la diffusion ACTION_DOWNLOAD_COMPLETE ne signifie pas que votre téléchargement est terminé. Notez que ACTION_DOWNLOAD_COMPLETE est diffusé par DownloadManager à la fin du téléchargement. Cela ne signifie pas nécessairement que c'est le même téléchargement que vous attendez

La solution consiste à enregistrer l'identifiant de téléchargement renvoyé par enqueue () lors du démarrage du téléchargement. Cet identifiant de téléchargement long est unique sur le système et peut être utilisé pour vérifier l'état du téléchargement.

DownloadManager downloadManager= (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
long downloadID = downloadManager.enqueue(request);// enqueue puts the download request in the queue.

Vous pouvez être averti de la fin de votre téléchargement en trois étapes.

Créez un BroadcastReceiver comme indiqué dans l'extrait ci-dessous. À l'intérieur du récepteur, nous vérifions simplement si la diffusion reçue est destinée à notre téléchargement en faisant correspondre l'identifiant de téléchargement reçu à notre téléchargement mis en file d'attente.

private BroadcastReceiver onDownloadComplete = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
           //Fetching the download id received with the broadcast
           long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
           //Checking if the received broadcast is for our enqueued download by matching download id
           if (downloadID == id) {
               Toast.makeText(MainActivity.this, "Download Completed", Toast.LENGTH_SHORT).show();
           }
       }
   };

Une fois que BroadcastReceiver est créé, vous pouvez vous inscrire à ACTION_DOWNLOAD_COMPLETE dans la méthode onCreate de votre activité.

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       registerReceiver(onDownloadComplete,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

   }

Il est également important de désenregistrer le BroadcastReceiver dans onDestroy. Cela garantit que vous n'écoutez que pour cette émission tant que l'activité est active

@Override
  public void onDestroy() {
      super.onDestroy();
      unregisterReceiver(onDownloadComplete);
  }

Je vous exhorte à lire l'exemple complet ici

10
IrshadKumail

Vous n'avez pas besoin de créer un fichier juste pour le voir. L'URI dans COLUMN_LOCAL_URI peut être utilisé dans setDataAndType (). Voir exemple ci-dessous.

 int uriIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
 String downloadedPackageUriString = cursor.getString(uriIndex);
 Intent open = new Intent(Intent.ACTION_VIEW);
 open.setDataAndType(Uri.parse(downloadedPackageUriString), mimeType);
 open.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
 startActivity(open);
0
ebernie