2017-01-16 10 views
7

Я пытаюсь выполнить загрузку файла с помощью DownloadManager. Все работает отлично, кроме устройств LG. Вот мой код:Менеджер загрузки не работает на устройствах LG

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(); 
} 

На LG устройств линии

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

возвращает -1. Загрузка уведомления появляется в панели уведомлений и исчезает сразу после нескольких миллисекунд. Ни одно исключение, никто не вводит этот код.

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; 
      } 

Просто ничего. Поэтому внутренний цикл while() работает навсегда. Протестировано на устройствах LG D802 и LG G3 S. Оба устройства показывают одинаковое поведение.

+0

это работает, если вы попытаетесь использовать URL-адрес, который не использует HTTPS? Я недавно столкнулся с той же проблемой, и пока это работает, если я переключаюсь с https на http. Это не всегда вариант, но, если возможно, это может сработать для вас. –

ответ

0

Я столкнулся с той же проблемой и нашел решение для этого. Вы должны убедиться, что все каталоги существуют до начала Download Manager. Пример: в моем случае путь к моему файлу является /storage/emulated/0/MyFolder/n.jpeg так что я должен убедиться, что MyFolder каталога существует до инициализации Download Manager.

 Смежные вопросы

  • Нет связанных вопросов^_^