Диспетчер загрузок Android повторяет попытку и завершается ошибкой с HTTP_DATA_ERROR

 class LongOperation extends AsyncTask<String, Void, String> {

                            @Override
                            protected String doInBackground(String... params) {

                                try {
                                    String url2 = "https://www.w3schools.com/w3css/img_fjords.jpg";
                                    String url = url2.replaceAll(" ", "%20");

                                    String fileName = URLUtil.guessFileName(url, null, MimeTypeMap.getFileExtensionFromUrl(url));

                                    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

                                    request.setMimeType(MimeTypeMap.getFileExtensionFromUrl(url));
                                    String cookies = CookieManager.getInstance().getCookie(url);
                                    //request.addRequestHeader("Cookie", cookies);
                                    //request.addRequestHeader("User-Agent", userAgent);
                                    request.setDescription("Downloading File");
                                    //request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
                                    request.setTitle("test.png");
                                    request.allowScanningByMediaScanner();
                                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
                                    DownloadManager downloadManager = (DownloadManager) module.getActivity().getSystemService(DOWNLOAD_SERVICE);
                                    if (downloadManager != null) {
                                        final long downloadID = downloadManager.enqueue(request);
                                        System.out.println(downloadID);


                                    }
                                    Toast.makeText(module.getActivity(), "Downloading File", Toast.LENGTH_LONG).show();
                                } catch (Exception e) {
                                    Log.e(TAG, e.getMessage());
                                }

                                return "Executed";
                            }

                            @Override
                            protected void onPostExecute(String result) {
                                Log.d("Post Execute","Post Execute");
                                // might want to change "executed" for the returned string passed
                                // into onPostExecute() but that is upto you
                            }

                            @Override
                            protected void onPreExecute() {}

                            @Override
                            protected void onProgressUpdate(Void... values) {}
                        }
                        new LongOperation().execute("");

Я использую приведенный выше код для загрузки изображения с использованием собственного кода Android в моем родном приложении для реагирования. Когда этот метод выполняется, статус загрузки переходит в состояние с именем STATUS_PAUSED -> PAUSED_WAITING_TO_RETRY, и через некоторое время происходит сбой с кодом ошибки ERROR_HTTP_DATA_ERROR. Я дал следующие разрешения в своем манифесте Android, а во время выполнения я также запрашиваю разрешение на хранение.

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Что я делаю не так?


person Lakshin Karunaratne    schedule 26.12.2017    source источник
comment
Тем временем прочитайте эту тему.   -  person ADM    schedule 26.12.2017
comment
Спасибо, проверю и проверю (Y)   -  person Lakshin Karunaratne    schedule 26.12.2017
comment
Нужно ли запускать этот код в асинхронной задаче?   -  person udit7395    schedule 26.12.2017
comment
Пробовал и без него. Все равно не повезло. Я добавил его, потому что я пытался загрузить с помощью HttpURLConnection, и когда я запустил это вне асинхронной задачи, он выдал исключение android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork   -  person Lakshin Karunaratne    schedule 26.12.2017
comment
Использование соединения httpURL в основном потоке даст вам исключение NetworkOnMainThreadException, но отправка запроса диспетчеру загрузки для загрузки файлов не будет   -  person udit7395    schedule 27.12.2017


Ответы (1)


Поместите этот код вне асинхронной задачи, где-нибудь в вашей деятельности/службе. Файл загружается в /sdcard0/Android/data/your_package_name/folder/

String fileName = URLUtil.guessFileName(url, null, MimeTypeMap.getFileExtensionFromUrl(url));
DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://www.w3schools.com/w3css/img_fjords.jpg"));
request.setDestinationInExternalFilesDir(getApplicationContext(), "folder/", fileName);
request.setMimeType(MimeTypeMap.getFileExtensionFromUrl("https://www.w3schools.com/w3css/img_fjords.jpg"));
request.setAllowedOverRoaming(true);
request.setVisibleInDownloadsUi(true);
request.setTitle("Downloading Image");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
long enqueue = downloadManager.enqueue(request);

Добавьте этот широковещательный приемник и ответьте с причиной

public void setupDownloadBroadcastReceivers() {
        TAG = "CopyADDB";
        Log.d(TAG, "Inside setupDownloadBroadcastReceivers");
        BroadcastReceiver download_receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                    long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                    DownloadManager.Query query = new DownloadManager.Query();
                    query.setFilterById(enqueue);
                    Cursor c = downloadManager.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                        Log.d(TAG, "Reason is " + c.getInt(columnIndex));
                        if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
                            String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                            String name = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE));
                            Log.d(TAG, "Download Complete");
                            Log.d(TAG, "File Name is " + name);
                            Log.d(TAG, "Path is " + uriString);
                        }
                        if (DownloadManager.STATUS_FAILED == c.getInt(columnIndex)) {
                            String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                            Log.d(TAG, "DownloadAppFailed");
                        }
                    }
                }
            }
        };
        registerReceiver(download_receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }
person udit7395    schedule 27.12.2017
comment
Та же ошибка? Можете ли вы убедиться, что ваше устройство подключено к Интернету и имеет все разрешения. - person udit7395; 28.12.2017
comment
Да все проверили. Действительно странная проблема. - person Lakshin Karunaratne; 28.12.2017
comment
Я обновил код. он добавляет широковещательный приемник, который прослушивает события загрузки. Соответственно добавляйте дополнительные журналы и смотрите, изменилась ли причина или это что-то другое - person udit7395; 28.12.2017
comment
Я уже пробовал с подобным кодом, но потом только я узнал, что статус загрузки становится приостановленным, ожидая повторной попытки, и в конечном итоге завершается ошибкой http_data_error - person Lakshin Karunaratne; 29.12.2017