2017-01-16 19 views
7

DownloadManagerを使用してファイルをダウンロードしようとしています。 LGデバイス以外はすべて正常に動作します。ここに私のコードは次のとおりです。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(); 
} 

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

HTTPSを使用しないURLで試してみるとうまくいきますか?私は最近、同じ問題を抱えています。これまでのところ、httpsからhttpに切り替えるとうまくいくようです。それはいつも選択肢ではありませんが、可能であればあなたのために働くことができます。 –

答えて

0

私は同じ問題に直面し、これに対する解決策を見つけました。 init Download Managerの前にすべてのディレクトリが存在することを確認する必要があります。 例:私の場合は私のファイルへのパスは、私はMyFolderというディレクトリがINITダウンロードマネージャの前に存在していることを確認する必要があり /storage/emulated/0/MyFolder/n.jpeg です。

関連する問題