6 votes

Android : Comment télécharger un fichier dans Android ?

J'essaie de télécharger un fichier à partir d'une URL. J'ai le code suivant.

package com.example.downloadfile;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class DownloadFile extends Activity {

     private static String fileName = "al.jpg";

     @Override
     public void onCreate(Bundle savedInstanceState) 
     {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = new TextView(this);
        tv.setText("This is download file program... ");

        try {
            //this is the file you want to download from the remote server
            String path ="http://www.fullissue.com/wp-content/uploads/2010/12/Adam-Lambert.jpg";
            //this is the name of the local file you will create

            String targetFileName = "al.jpg";

            boolean eof = false;

            URL u = new URL(path);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            String PATH_op = Environment.getExternalStorageDirectory() + "/download/" + targetFileName;

            tv.append("\nPath > " + PATH_op);

            FileOutputStream f = new FileOutputStream(new File(PATH_op));

            InputStream in = c.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ( (len1 = in.read(buffer)) > 0 ) {
                f.write(buffer,0, len1);
            }

            f.close();

            } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            } catch (ProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }

        tv.append("\nAnother append!");
        this.setContentView(tv);
    }

}

Quelqu'un peut-il me dire ce qui ne va pas dans ce code ? Je n'arrive pas à voir le fichier que je suis censé télécharger. Je suis novice en java et en développement Android, merci pour toute aide :)

7voto

CommonsWare Points 402670
  1. Vous effectuez des E/S réseau sur le thread principal de l'application. Au mieux, cela gèlera votre interface utilisateur pendant le téléchargement. Au pire, votre activité se bloquera avec une boîte de dialogue "Application Not Responding" (ANR).

  2. Vous essayez d'écrire dans un répertoire ( download/ ) sur un support externe qui pourrait ne pas exister. Veuillez d'abord créer le répertoire.

  3. Veuillez envisager de passer à l'utilisation de Log.e() pour l'enregistrement des erreurs, car je ne sais pas si les printStackTrace() fonctionne sur Android.

Assurez-vous également que vous disposez de la WRITE_EXTERNAL_STORAGE et que vous utilisez adb logcat DDMS, ou la perspective DDMS dans Eclipse pour examiner LogCat et rechercher les messages d'erreur que vous essayez d'enregistrer.

2voto

Tout d'abord, vous devez ajouter des permissions à AndroidManifest.xml :

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

Deuxièmement, ajoutez ce code, de sorte que si le dossier n'existe pas, il vérifie et crée le dossier :

File root = android.os.Environment.getExternalStorageDirectory();               

           File dir = new File (root.getAbsolutePath() + "/download");
           if(!dir.exists()) {
                dir.mkdirs();
           }

Troisièmement, comme l'a dit Commons Ware, le téléchargement sur le thread principal n'est pas une bonne pratique ; vous devriez le mettre en œuvre sur un nouveau thread ; parce que pendant le téléchargement, le thread principal est occupé à télécharger le fichier. Si le temps d'attente est plus long que prévu, le système génère l'erreur "Not responding".

Pour ce faire, vous pouvez utiliser " TaskAsync " ou " IntentService "ou même de créer un nouveau fil de discussion.

Comme vous avez dit que vous étiez novice en Java, je vous suggère d'utiliser " TaskAsync "Il s'agit d'une procédure très simple et facile.

2voto

lyy Points 21

Le lib vous aidera

https://github.com/AriaLyy/Aria

téléchargement d'un fichier avec un seul code

Aria.download(this)
    .load(DOWNLOAD_URL)
    .setDownloadPath(DOWNLOAD_PATH) //file save path
    .add();

obtenir l'état du téléchargement

@Download.onPre(DOWNLOAD_URL)
  protected void onPre(DownloadTask task) {}

  @Download.onTaskStart
  void taskStart(DownloadTask task) {}

  @Download.onTaskRunning
  protected void running(DownloadTask task) {}

  @Download.onTaskResume
  void taskResume(DownloadTask task) {}

  @Download.onTaskStop
  void taskStop(DownloadTask task) {}

  @Download.onTaskCancel
  void taskCancel(DownloadTask task) {}

  @Download.onTaskFail
  void taskFail(DownloadTask task) {}

  @Download.onTaskComplete
  void taskComplete(DownloadTask task) {}

  @Download.onNoSupportBreakPoint
  public void onNoSupportBreakPoint(DownloadTask task) {}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X