2016-05-29 3 views
3

Я использовал класс Download Manager, чтобы загрузить текстовый файл, код, который я загрузить файл является:Android: Как сослаться на файл, загруженный на DownloadManager

private long enqueue 
private DownloadManager dm; 
String server_ip = "http://192.168.0.1/"; 

Request request = new Request(Uri.parse(server_ip + "test.txt")); 
// Store to common external storage: 
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "test.txt"); 
enqueue = dm.enqueue(request); 

И у меня есть boardcast приемник к проверьте, успешно ли загружена. Если загрузка прошла успешно, я буду стараться, чтобы отобразить текстовый файл в TextView:

BroadcastReceiver receiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 
     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 

      Query query = new Query(); 
      query.setFilterById(enqueue); 
      Cursor c = dm.query(query); 

      for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
       int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS); 

       // Check if the download is successful 
       if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { 

        // Get the downloaded file and display the test.txt in a textView 
        File file = new File(storage_directory,"test.txt"); 
        StringBuilder text = new StringBuilder(); 
        try { 
         BufferedReader br = new BufferedReader(new FileReader(file)); 
         String line; 

         while ((line = br.readLine()) != null) { 
          text.append(line); 
          text.append('\n'); 
         } 
         br.close(); 

         TextView tv = (TextView)findViewById(R.id.textView); 
         tv.setText(text); 
        } 
        catch (Exception e) { 
         //You'll need to add proper error handling here 
        } 
       } 
      } 
     } 
    } 
} 

Одна проблема, которую я нашел, если уже есть файл с таким же именем файла, «text.txt», устройство переименует новый файл загрузки в "text-1.txt". В результате, когда я пытаюсь отобразить недавно загруженный файл, вместо него будет отображаться старый файл test.txt. Я хотел бы спросить, как я могу сослаться на новый файл при успешном завершении загрузки, вместо того, чтобы указать имя файла, как то, что я сделал:

File file = new File(storage_directory,"test.txt"); 

Кроме того, я downloadeded файла на внешнее запоминающее устройство. Я знаю, что если я не добавить эту строку:

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "test.txt"); 

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

спасибо.

Update: Если добавить эту строку после того, как файл получен успешно в вещательном приемнике:

String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 

uriString дать мне

файла: /// хранение/эмулировать/0/Download/test.txt

+0

Проверьте это http://www.gadgetsaint.com/android/download-manager/#.WSK0Yut96Hs – ASP

ответ

3

Имея много попыток, я нашел способ решить свою проблему Эм. Я не знаю, является ли это хорошим решением, но кажется, что это работает. Я добавил следующий код после того, как он получил успешно файл в вещательном приемнике, что я добавил:

int filenameIndex = c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME); 
String filename = c.getString(filenameIndex); 
File file = new File(filename); 

и удалить этот код:

File file = new File(storage_directory,"test.txt"); 

после:

if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { 

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

+0

Запрос менеджера загрузки действительно способ получить локальный файл. Если вам не нужно имя локального файла до завершения загрузки, то это путь. – user149408

+0

Использование COLUMN_LOCAL_FILENAME устарело в API 24 и выдает исключение SecurityException в Нуге – roplacebo

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