Ошибка диспетчера загрузки Ошибка файла

Я использую Download Manager 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);


    }

Это дает Download Failed, ERROR_FILE_ERROR

2 ответа

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

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

Это было какое-то время, но только для записи. Это также случилось со мной на 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");
Другие вопросы по тегам