使用下载管理器下载 zip 文件

Downloading a zip file using download manager

我想使用 download manager.Using 下载 zip 文件,此代码在通知中显示正在下载文件,稍后显示下载失败。我给外部读写等权限directory.My 代码如下:

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

我用这个解决了这个问题:

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