2016-05-29 18 views
3

でダウンロードしたファイルを参照するために、私はファイルをダウンロードするコードは次のとおりです。アンドロイド:どのように私は、テキストファイルをダウンロードするにはダウンロードマネージャクラスを使用していた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のでtxtファイルを表示しようとします:私が見つけ

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"); 

私はダウンロードマネージャに要求を送信する場合、ファイルが内部ストレージにdonwloadedされます。この場合、ファイルをどのように参照できますか?

ありがとうございました。

更新:放送受信に成功したファイルを受け取った後、私はこの行を追加する場合 は:

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

多くの試みがあり、私は自分のproblを解決する方法を見つけましたem。私はこれが良い解決策であるかどうかわかりませんが、それはうまくいくようです。

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では廃止され、NougatではSecurityExceptionがスローされます – roplacebo

関連する問題