2013-07-01 2 views
0

Я пишу приложение для загрузки файла по URL-адресу одним нажатием кнопки. Проблема в том, что после успешной загрузки (по-видимому) я не могу найти файл на своей SD-карте. Я даже попытался вывести массив String Context.fileList(), но он ничего не содержит (в результате появляется журнал ошибок «Нет файлов»).Не удается найти загруженный файл на устройстве

Как я могу сказать, что загрузка была выполнена вообще? Хорошо, я вижу, что соединение с данными активируется сразу после нажатия кнопки, и оно расслабляется только через 3-4 секунды, в течение которого я предполагаю, что он загружал файл размером менее 100 КБ.

Вот код основной деятельности:

package com.filedownloaddemo; 

import java.io.File; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.StrictMode; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    Button btn; 
    // URL to download from 
    String url = "http://www.edco.ie/_fileupload/The%20Interlopers%20-%20A%20short%20story%20by%20Saki.pdf"; 
    // file variable 
    File outputFile; 

    @SuppressLint("NewApi") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     btn = (Button) findViewById(R.id.button1); 

     // set Android policy 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
       .permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
    } 

    // onClick handler for the button 
    public void download(View v) { 
     try { 
      outputFile = new File(Environment.getExternalStorageDirectory() + File.separator + "myfile.pdf"); 
      DownloadHelper.downloadFile(url, outputFile); 
     } catch (Exception e) { 
      Log.d("DL_Error", e.getMessage()); 
     } 

     if (this.fileList().length == 0) { 
      Log.d("DL_Error", "No files created."); 
     } else { 
      // write file names to Log 
      for (String s : this.fileList()) { 
       Log.d("Download", s); 
      } 
     } 
    } 
} 

А вот файл, который загружает (это взято из одного из ответов на это сообщество):

package com.filedownloaddemo; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URL; 
import java.net.URLConnection; 

import android.util.Log; 

public class DownloadHelper { 

    public static void downloadFile(String url, File outputFile) { 
     try { 
      URL u = new URL(url); 
      URLConnection conn = u.openConnection(); 
      int contentLength = conn.getContentLength(); 

      DataInputStream stream = new DataInputStream(u.openStream()); 

      byte[] buffer = new byte[contentLength]; 
      stream.readFully(buffer); 
      stream.close(); 

      DataOutputStream fos = new DataOutputStream(new FileOutputStream(
        outputFile)); 
      fos.write(buffer); 
      fos.flush(); 
      fos.close(); 
     } catch (Exception e) { 
      Log.d("DL_Error", e.getMessage()); 
     } 
    } 
} 

Пожалуйста, помогите!

+2

Где ваше имя файла ??? Вы должны использовать Environment.getExternalStorageDirectory() + "/ filename.pdf"; –

+1

Исключения для «глотания» - это плохо, 'Log' them (не использовать' printStackTrace() 'на Android) –

+0

Как вы проверяете наличие этого файла? –

ответ

0

Немногие вещи:

Environment.getExternalStorageDirectory(); 

не является правильным местом для сохранения файла, вы должны дать ему имя.

Environment.getExternalStorageDirectory() + "/myfile.pdf"; 

Также убедитесь, что у вас есть следующее разрешение в вашем manifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Кроме того, onDestroy() не гарантируется дозвонились, так что это не очень хорошее место, чтобы проверить.

Наконец, чтобы увидеть файл, когда вы подключаете свое устройство к компьютеру, вам может потребоваться сообщить MediaScanner, что есть новый файл для индексации.

Отправить трансляцию после того, как файл был сохранен, чтобы убедиться, что он получает взял в MediaStore

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
intent.setData(Uri.fromFile(file)); 
sendBroadcast(intent); 
+0

Ну, 'Environment.getExternalStorageDirectory() +" /myfile.pdf ";' выдает ошибку, потому что первая имеет тип File. Каков правильный путь? – dotslash

+1

'outputFile = new File (Environment.getExternalStorageDirectory() + File.separator + "myfile.pdf"); ' –

+0

См. отредактированное оригинальное сообщение. Теперь получаем ошибку 'No files created '. – dotslash

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