2016-04-30 18 views
1

Wie kann ich einige Dateien von meinem Webserver in meiner Android-Anwendung herunterladen und speichern Sie sie in Anwendung Ordner im Stammverzeichnis oder in einem privaten Ordner im internen/externen Speicher.Download-Datei mit Android-Download-Manager und speichern in Anwendungsordner

Ich kann Dateien herunterladen, aber ich kann sie nicht in einem privaten Ordner speichern.

Bereits schreibe ich meinen Download-Manager und ich habe einige Probleme mit der Anzeige von Benachrichtigungen (wie Download Prozent) damit.

+0

verweisen Sie auf diese [link] (http://stackoverflow.com/a/3028660/3746306). und was genau meinst du mit dem privaten Ordner? –

+0

das bedeutet andere Anwendungen und Benutzer hat keine Berechtigung zum Schreiben oder Lesen (oder Kopieren) von Dateien und Ordnern – FarshidABZ

Antwort

2

Ich bin mir nicht ganz sicher, was Sie wollen mit „privaten Ordnern“ zu tun ... aber das ist, wie ich Dateien mit einem Fortschritt Callback herunterladen:

public class Downloader extends Thread implements Runnable{ 
    private String url; 
    private String path; 
    private DownloaderCallback listener=null; 

    public Downloader(String path, String url){ 
     this.path=path; 
     this.url=url; 
    } 

    public void run(){ 
     try { 
      URL url = new URL(this.url); 
      URLConnection urlConnection = url.openConnection(); 
      urlConnection.connect(); 

      String filename = urlConnection.getHeaderField("Content-Disposition"); 
      // your filename should be in this header... adapt the next line for your case 
      filename = filename.substring(filename.indexOf("filename")+10, filename.length()-2); 

      int total = urlConnection.getContentLength(); 
      int count; 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(path+"/"+filename); 

      byte data[] = new byte[4096]; 
      long current = 0; 

      while ((count = input.read(data)) != -1) { 
       current += count; 
       if(listener!=null){ 
        listener.onProgress((int) ((current*100)/total)); 
       } 
       output.write(data, 0, count); 
      } 

      output.flush(); 

      output.close(); 
      input.close(); 

      if(listener!=null){ 
       listener.onFinish(); 
      } 
     } catch (Exception e) { 
      if(listener!=null) 
       listener.onError(e.getMessage()); 
     } 
    } 

    public void setDownloaderCallback(DownloaderCallback listener){ 
     this.listener=listener; 
    } 

    public interface DownloaderCallback{ 
     void onProgress(int progress); 
     void onFinish(); 
     void onError(String message); 
    } 
} 

es zu benutzen:

Downloader dl = new Downloader("/path/to/save/file", "http://server.com/download"); 
dl.setDownloaderCallback(new DownloaderCallback{ 
    @Override 
    void onProgress(int progress){ 

    } 

    @Override 
    void onFinish(){ 

    } 

    @Override 
    void onError(String message){ 

    } 
}); 
dl.start(); 
+0

Vielen Dank für Ihre Antwort, und wie Download Fortschritt in Benachrichtigungen angezeigt werden? wenn ich versuche, es zu zeigen, habe ich eine schlechte Verzögerung beim Scrollen Benachrichtigungsleiste – FarshidABZ

+0

http://developer.android.com/intl/in/training/notify-user/display-progress.html –

0

Für Ihren privaten Modus müssen Sie die Datei verschlüsseln und auf SD-Karte/intern speichern. refer this

0

Wenn Sie Ihre heruntergeladene Datei in externen Speicher möchten, können Sie verwenden.

String storagePath = Environment.getExternalStorageDirectory().getPath()+ "/Directory_name/"; 
//Log.d("Strorgae in view",""+storagePath); 
File f = new File(storagePath); 
if (!f.exists()) { 
    f.mkdirs(); 
} 
//storagePath.mkdirs(); 
String pathname = f.toString(); 
if (!f.exists()) { 
    f.mkdirs(); 
} 
//Log.d("Storage ",""+pathname); 
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 
Uri uri = Uri.parse(image); 
checkImage(uri.getLastPathSegment()); 
if (!downloaded) { 
    DownloadManager.Request request = new DownloadManager.Request(uri); 
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
    request.setDestinationInExternalPublicDir("/Directory_name", uri.getLastPathSegment()); 
    Long referese = dm.enqueue(request); 
    Toast.makeText(getApplicationContext(), "Downloading...", Toast.LENGTH_SHORT).show(); 
} 
Verwandte Themen