Download manager does not work on LG devices

I am trying to download a file using DownloadManager . Everything works fine except for LG devices. Here is my code:

private void downloadFile(FileInfo fileInfo) { private DownloadManager manager = (DownloadManager) MyApp.getSingleton(). getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE); DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://" + MyPreference.getInstance().getBaseUrl() + "/api/v3/files/" + fileId + "/get")); request.setDescription(MyApp.getSingleton().getApplicationContext().getString(R.string.downloading)); request.setTitle(fileInfo.getmName()); request.addRequestHeader("Authorization", "Bearer " + MyPreference.getInstance().getAuthToken()); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); File dir = new File(FileUtil.getInstance().getDownloadedFilesDir()); if(!dir.exists()){ dir.mkdirs(); } request.setDestinationUri(Uri.fromFile(new File(FileUtil.getInstance().getDownloadedFilesDir() + File.separator + fileInfo.getmName()))); downloadId = manager.enqueue(request); new Thread(() -> { boolean downloading = true; while (downloading) { DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById(downloadId); Cursor cursor = manager.query(q); cursor.moveToFirst(); int bytes_downloaded = 0; long bytes_total = 0; try { bytes_downloaded = cursor.getInt(cursor .getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); bytes_total = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); } catch (CursorIndexOutOfBoundsException e) { e.printStackTrace(); cursor.close(); break; } catch (IllegalArgumentException e){ e.printStackTrace(); cursor.close(); break; } if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) { downloading = false; cursor.close(); onDownloadFail(); break; } else if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) { downloading = false; cursor.close(); break; } if (bytes_total > 0) { final int dl_progress = (int) ((bytes_downloaded * 100L) / bytes_total); onProgress(dl_progress); } cursor.close(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } 

In the line of LG devices

 bytes_total = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 

returns -1. A download notification appears in the notification panel and disappears immediately after a few milliseconds. No exception, no one enters this section of code

 if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) { downloading = false; cursor.close(); onDownloadFail(); break; } else if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) { downloading = false; cursor.close(); break; } 

Just nothing. Therefore, the inner while () loop works forever. Tested on LG D802 and LG G3 S. Both devices show the same behavior.

+7
android file android-download-manager download-manager
source share
1 answer

I ran into the same problem and found a solution for this. You must ensure that all directories exist before starting Download Manager. Example: in my case, the path to my file /storage/emulated/0/MyFolder/n.jpeg so I have to make sure that MyFolder exists directory before downloading Download Manager.

0
source share

All Articles