1

Я использую API диспетчера загрузки для загрузки файлов с сервера через HTTP-запрос. Этот метод отлично работает для Android API версии < 11. Мне нужно реализовать его для Android API версии 10 (GingerBread). В этом случае он дает ERROR_FILE_ERROR. Пожалуйста посоветуй.Ошибка файла ошибки диспетчера загрузок

Uri uri = Uri.parse(serverConnection.url + serverConnection.studentSearchService +  "GetAssignmentFile/" + serverConnection.connectionString + fileList.get(i).getFileId()); 



     final DownloadManager downloadManager = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE); 
     DownloadManager.Request downloadReq = new DownloadManager.Request(uri); 
     downloadReq 
       .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI 
         | DownloadManager.Request.NETWORK_MOBILE); 
     // downloadReq.allowScanningByMediaScanner(); 
     downloadReq.setMimeType(fileList.get(i).getFileType()); 
     downloadReq.setTitle(fileList.get(i).getFileName()); 

      downloadReq.setDescription("attachment"); 
      downloadReq.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileList.get(i).getFileName()); 
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { 

       downloadReq.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE | DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 

      } 
      else 
      { 
       downloadReq.setShowRunningNotification(true); 
       downloadReq.setVisibleInDownloadsUi(true); 
      } 


      myDownloadReference = downloadManager.enqueue(downloadReq); 


     IntentFilter intentFilter= new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 
     receiverDownloadComplete=new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       String extraId= DownloadManager.EXTRA_DOWNLOAD_ID; 
       long reference=intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,-1); 

        if(reference==myDownloadReference) 
        { 
         //Toast.makeText(getActivity(),"Downloaded",Toast.LENGTH_SHORT).show(); 

         DownloadManager.Query query= new DownloadManager.Query(); 
         query.setFilterById(reference); 
         Cursor cursor=downloadManager.query(query); 
         cursor.moveToFirst(); 
         int columnIndex=cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 
         int status=cursor.getInt(columnIndex); 

         int columnReason=cursor.getColumnIndex(DownloadManager.COLUMN_REASON); 
         int reason=cursor.getInt(columnReason); 
         switch(status) 
         { 
          case DownloadManager.STATUS_SUCCESSFUL: 

           Toast.makeText(getActivity(),"File Saved at:"+fileSavedPath,Toast.LENGTH_SHORT).show(); 
           break; 

          case DownloadManager.STATUS_FAILED: 


          String failedReason=""; 

             switch(reason){ 
              case DownloadManager.ERROR_CANNOT_RESUME: 
               failedReason = "ERROR_CANNOT_RESUME"; 
               break; 
              case DownloadManager.ERROR_DEVICE_NOT_FOUND: 
               failedReason = "ERROR_DEVICE_NOT_FOUND"; 
               break; 
              case DownloadManager.ERROR_FILE_ALREADY_EXISTS: 
               failedReason = "ERROR_FILE_ALREADY_EXISTS"; 
               break; 
              case DownloadManager.ERROR_FILE_ERROR: 
               failedReason = "ERROR_FILE_ERROR"; 
               break; 
              case DownloadManager.ERROR_HTTP_DATA_ERROR: 
               failedReason = "ERROR_HTTP_DATA_ERROR"; 
               break; 
              case DownloadManager.ERROR_INSUFFICIENT_SPACE: 
               failedReason = "ERROR_INSUFFICIENT_SPACE"; 
               break; 
              case DownloadManager.ERROR_TOO_MANY_REDIRECTS: 
               failedReason = "ERROR_TOO_MANY_REDIRECTS"; 
               break; 
              case DownloadManager.ERROR_UNHANDLED_HTTP_CODE: 
               failedReason = "ERROR_UNHANDLED_HTTP_CODE"; 
               break; 
              case DownloadManager.ERROR_UNKNOWN: 
               failedReason = "ERROR_UNKNOWN"; 
               break; 
             } 


           Toast.makeText(getActivity(),"Download failed because "+failedReason,Toast.LENGTH_SHORT).show(); 

           break; 

         } 



       } 
      } 
     }; 
     getActivity().registerReceiver(receiverDownloadComplete,intentFilter); 


    } 

Это дает не удалось выполнить загрузку, ERROR_FILE_ERROR

ответ

1

Это было какое-то время, но только для записи. Это также случилось со мной на Nexus 4 с Android KitKat 4.4.4. Однако на Nexus 5 & 6 с Android Lollipop я не вижу эту ошибку. В моем случае решением было удалить имя папки из второго параметра в setDestinationInExternalPublicDir. Вместо этого:

downloadReq.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "myFolder/fileName.txt"); 

Используйте это:

downloadReq.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "fileName.txt"); 
2

У меня есть некоторые проблемы. Чтобы решить эту проблему, убедитесь, что существует родительский каталог целевого файла.

fileList.get(i).getParentFile().mkdirs() //make sure parent directory is exist 
downloadReq.setDescription("attachment"); 
downloadReq.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileList.get(i).getFileName());