Search code examples
androiddownloadzipandroid-download-manager

Downloading a zip file using download manager


I want to download a zip file using download manager.Using this code it shows downloading file in notification and later shows download failed. I gave permissions such as read and write external directory.My code is as follows:

              if(DownloadTask.readAndWriteExternalStorage(context)){
                    downloadManager=
               (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
                    Uri  uri=Uri.parse("url of zip");
                    DownloadManager.Request request=  new 
                                         DownloadManager.Request(uri);




    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE| 
                              DownloadManager.Request.NETWORK_WIFI);
                    request.setVisibleInDownloadsUi(true);
                    request.setTitle("Example");
                    request.setDescription("Downloading a very large zip");

                    request.setAllowedOverRoaming(true);
                    request.setMimeType("df.zip");
                    request.allowScanningByMediaScanner();





  request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, 
              "df.zip");
                     request.setNotificationVisibility(DownloadManager. 
           Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    Long reference=downloadManager.enqueue(request);
                }

Solution

  • I solved the issue with this:

    DownloadManager downloadManager;
    
    private int count = 0;
        private long Zip_DownloadId,imid;  
         Uri uri = 
    
     Uri.parse("http://website//"+rowItems.get(i).get("Attachments"));
                  if ( uri.toString().endsWith(".jpg")) {
                        imid=DownloadData(uri, view);
                      Check_Image_Status(imid);
                  } else if (uri.toString().endsWith(".png")) {
                      imid=DownloadData(uri, view);
                      Check_Image_Status(imid);
                  } else if (uri.toString().endsWith(".jpeg")) {
                      imid=DownloadData(uri, view);
                      Check_Image_Status(imid);
    
                  } else if (uri.toString().endsWith(".zip")) {
                       Zip_DownloadId = DownloadData(uri, view);
                      Check_Zip_Status(Zip_DownloadId);
                  }
                    Toast.makeText(getApplicationContext(),uri.toString(),Toast.LENGTH_LONG).show();
    
    
                }
    
    
            });
    
    
            downloadReceiver = new BroadcastReceiver() {
    
                @Override
                public void onReceive(Context context, Intent intent) {
    
                    //check if the broadcast message is for our Enqueued download
                    long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
    
                    if (referenceId == imid) {
    
                        Toast toast = Toast.makeText(SupportTicketViewActivity.this,
                                "Image Download Complete", Toast.LENGTH_LONG);
                        toast.setGravity(Gravity.TOP, 25, 400);
                        toast.show();
    
                    } else if (referenceId == Zip_DownloadId) {
                        Toast toast = Toast.makeText(SupportTicketViewActivity.this,
                                "Zip Download Complete", Toast.LENGTH_LONG);
                        toast.setGravity(Gravity.TOP, 25, 400);
                        toast.show();
                    }
    
                }
            };
            return view;
        }
    
    
        private void Check_Zip_Status(long Zip_DownloadId) {
    
            DownloadManager.Query ZipDownloadQuery = new DownloadManager.Query();
            //set the query filter to our previously Enqueued download
            ZipDownloadQuery.setFilterById(Zip_DownloadId);
    
            //Query the download manager about downloads that have been requested.
            Cursor cursor = downloadManager.query(ZipDownloadQuery);
            if (cursor.moveToFirst()) {
                DownloadStatus(cursor, Zip_DownloadId);
            }}
    
    
        private void Check_Image_Status(long imid) {
            DownloadManager.Query ImageDownloadQuery = new DownloadManager.Query();
            //set the query filter to our previously Enqueued download
            ImageDownloadQuery.setFilterById(imid);
    
            //Query the download manager about downloads that have been requested.
            Cursor cursor = downloadManager.query(ImageDownloadQuery);
            if(cursor.moveToFirst()){
                DownloadStatus(cursor, imid);
            }
        }
    
        private void DownloadStatus(Cursor cursor, long DownloadId) {
            int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
            int status = cursor.getInt(columnIndex);
            //column for reason code if the download failed or paused
            int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);
            int reason = cursor.getInt(columnReason);
            //get the download filename
            int filenameIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
            String filename = cursor.getString(filenameIndex);
    
            String statusText = "";
            String reasonText = "";
    
            switch(status){
                case DownloadManager.STATUS_FAILED:
                    statusText = "STATUS_FAILED";
                    switch(reason){
                        case DownloadManager.ERROR_CANNOT_RESUME:
                            reasonText = "ERROR_CANNOT_RESUME";
                            break;
                        case DownloadManager.ERROR_DEVICE_NOT_FOUND:
                            reasonText = "ERROR_DEVICE_NOT_FOUND";
                            break;
                        case DownloadManager.ERROR_FILE_ALREADY_EXISTS:
                            reasonText = "ERROR_FILE_ALREADY_EXISTS";
                            break;
                        case DownloadManager.ERROR_FILE_ERROR:
                            reasonText = "ERROR_FILE_ERROR";
                            break;
                        case DownloadManager.ERROR_HTTP_DATA_ERROR:
                            reasonText = "ERROR_HTTP_DATA_ERROR";
                            break;
                        case DownloadManager.ERROR_INSUFFICIENT_SPACE:
                            reasonText = "ERROR_INSUFFICIENT_SPACE";
                            break;
                        case DownloadManager.ERROR_TOO_MANY_REDIRECTS:
                            reasonText = "ERROR_TOO_MANY_REDIRECTS";
                            break;
                        case DownloadManager.ERROR_UNHANDLED_HTTP_CODE:
                            reasonText = "ERROR_UNHANDLED_HTTP_CODE";
                            break;
                        case DownloadManager.ERROR_UNKNOWN:
                            reasonText = "ERROR_UNKNOWN";
                            break;
                    }
                    break;
                case DownloadManager.STATUS_PAUSED:
                    statusText = "STATUS_PAUSED";
                    switch(reason){
                        case DownloadManager.PAUSED_QUEUED_FOR_WIFI:
                            reasonText = "PAUSED_QUEUED_FOR_WIFI";
                            break;
                        case DownloadManager.PAUSED_UNKNOWN:
                            reasonText = "PAUSED_UNKNOWN";
                            break;
                        case DownloadManager.PAUSED_WAITING_FOR_NETWORK:
                            reasonText = "PAUSED_WAITING_FOR_NETWORK";
                            break;
                        case DownloadManager.PAUSED_WAITING_TO_RETRY:
                            reasonText = "PAUSED_WAITING_TO_RETRY";
                            break;
                    }
                    break;
                case DownloadManager.STATUS_PENDING:
                    statusText = "STATUS_PENDING";
                    break;
                case DownloadManager.STATUS_RUNNING:
                    statusText = "STATUS_RUNNING";
                    break;
                case DownloadManager.STATUS_SUCCESSFUL:
                    statusText = "STATUS_SUCCESSFUL";
                    reasonText = "Filename:\n" + filename;
                    break;
            }
    
            if (DownloadId == Zip_DownloadId) {
    
                Toast toast = Toast.makeText(SupportTicketViewActivity.this,
                        "Zip Download Status:" + "\n" + statusText + "\n" +
                                reasonText,
                        Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP, 25, 400);
                toast.show();
    
            } else {
    
                Toast toast = Toast.makeText(SupportTicketViewActivity.this,
                        "Image Download Status:" + "\n" + statusText + "\n" +
                                reasonText,
                        Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP, 25, 400);
                toast.show();
    
    
                // Make a delay of 3 seconds so that next toast (Music Status) will not merge with this one.
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                    }
                }, 3000);
    
            }
    
        }
    
    }
    
        private long DownloadData(Uri uri, View view) {
            long downloadReference;
    
            downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
            DownloadManager.Request request = new DownloadManager.Request(uri);
    
            //Setting title of request
            request.setTitle("Data Download");
    
            //Setting description of request
            request.setDescription("Android Data download using DownloadManager.");
    
            //Set the local destination for the downloaded file to a path within the application's external files directory
    
             if(uri.toString().endsWith(".jpg")) {
                 request.setDestinationInExternalFilesDir(SupportTicketViewActivity.this, Environment.DIRECTORY_DOWNLOADS, "AndroidTutorialPoint.jpg");
             }else if (uri.toString().endsWith(".zip")){
                 request.setDestinationInExternalFilesDir(SupportTicketViewActivity.this, Environment.DIRECTORY_DOWNLOADS, "AndroidTutorialPoint.zip");
             }else if(uri.toString().endsWith(".png")) {
                 request.setDestinationInExternalFilesDir(SupportTicketViewActivity.this, Environment.DIRECTORY_DOWNLOADS, "AndroidTutorialPoint.png");
             } else  if(uri.toString().endsWith(".jpeg")) {
                 request.setDestinationInExternalFilesDir(SupportTicketViewActivity.this, Environment.DIRECTORY_DOWNLOADS, "AndroidTutorialPoint.jpeg");
             }  //Enqueue download and save the referenceId
            downloadReference = downloadManager.enqueue(request);
    
    
    
            return downloadReference;
        }