Диспетчер загрузки 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"/>
Что я делаю неправильно?
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));
}