2015-05-07 2 views
1

В приложении для Android я пытаюсь загрузить файл с веб-сервера в папку/Download на внешнем хранилище. код загрузки выполнен в HandlerThread в сервисе.

Служба выполняет другие функции, кроме загрузки файла. код для загрузки выглядит следующим образом:Загрузите файл с веб-сервера в внешнее хранилище android

public void downloadFile(){ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try{ 
        URL url = new URL("http://192.168.1.105/download/apkFile.apk"); 
        HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
        InputStream inputStream = connection.getInputStream(); 

        File file = new File(Environment.getExternalStorageDirectory().getPath()+"/Download/apkFile.apk"); 
        FileOutputStream fileOutputStream = new FileOutputStream(file); 
        int bytesRead; 
        byte[] buffer = new byte[4096]; 
        while((bytesRead = inputStream.read(buffer)) != -1){ 
         fileOutputStream.write(buffer, 0, bytesRead); 
        } 
        fileOutputStream.close(); 
        inputStream.close(); 
       }catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 

Ошибка не выполняется, но файл не загружен. Пожалуйста, предложите.

+0

Так какой каталог файл хранится в? –

+0

Что показывает showUutput? Поместите showOutput в блок catch. Есть ли связь? Поместите лог-таблицы в свой код, чтобы вы могли следить за потоком. – greenapps

+0

@greenapps вы правы, чтобы указать, это ничего не значит ... Я редактировал код. Любые предложения, почему файл не загружается .. –

ответ

4

Вы можете использовать AndroidDownloadManager.

Этот класс обрабатывает все этапы загрузки файла и получает вас информацию о ходе доб ...

Вы должны избегать использования потоков.

Это, как вы его используете:

public void StartNewDownload(url) {  
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); /*init a request*/ 
    request.setDescription("My description"); //this description apears inthe android notification 
    request.setTitle("My Title");//this description apears inthe android notification 
    request.setDestinationInExternalFilesDir(context, 
      "directory", 
      "fileName"); //set destination 
    //OR 
    request.setDestinationInExternalFilesDir(context, "PATH"); 
    DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
    final long downloadId = manager.enqueue(request); //start the download and return the id of the download. this id can be used to get info about the file (the size, the download progress ...) you can also stop the download by using this id  
} 
+0

Как я могу узнать, когда загрузка закончилась, потому что мне нужно инициировать некоторые функции в загруженном файле. –

+1

'DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById (mDownloadId); Курсор курсор = менеджер.query (q); cursor.moveToFirst(); ' , это запустит курсор из запроса. 'INT bytes_total = cursor.getInt (cursor.getColumnIndex (DownloadManager.COLUMN_TOTAL_SIZE_BYTES));' => это получает вас общий размер файла 'INT bytes_downloaded = cursor.getInt (cursor.getColumnIndex (DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); '=> это вам, сколько вы загрузили из этого файла –

+0

@WajdiChamakhi Что делать, если вам нужно загрузить сразу несколько файлов? –

0

вызов

connection.setDoInput(true); 
connection.connect(); 

перед тем

InputStream inputStream = connection.getInputStream(); 
+0

скачать еще не начинается! –

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