jelven

[Resolu] Télécharger un fichier sur carte SD

Recommended Posts

Bonjour,

Je suis en train de créé une application et je voudrais ajouter une fonctionnalité pour télécharger un fichier et pour l'enregistre directement sur la carte SD

J'ai créé un une activity avec se code :

package com.android.kaluaks;
import java.io.File;
import com.android.kaluaks.Download.Events;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class StartDownloadActivity extends Activity implements Events {

Download dl;
ProgressBar view;

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.start_download);
	view = (ProgressBar) findViewById(R.id.progress);
	dl = new Download(this,"http://earthobservatory.nasa.gov/images/imagerecords/45000/45618/ISS024-E-012425_lrg.jpg","lrg.jpg",this);
	dl.start();
}
@Override
protected void onDestroy() {
 dl.stop();
 super.onDestroy();
}
public void onprogress(int sent, int length) {
view.setProgress((int)((float)sent/(float)length*100));
}
public void onstart(int length) {
view.setProgress(0);
}
public void onfinish(File file) {
//((ImageView)findViewById(R.id.image)).setImageBitmap(BitmapFactory.decodeFile(dl.getDataFile().getAbsolutePath()));
}

}

Et un fichier java avec ce code :

package com.android.kaluaks;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.zip.GZIPInputStream;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
public class Download {

public interface Events {
public void onstart(int length);
public void onprogress(int sent, int length);
public void onfinish(File file);
}

private String mUrl;
private long	mCurrent;
private long mLength;
private Context mContext;
private boolean mRunning;
private Handler mHandler;
private Events mEvents;
private String mName;

public File getDataFile(){
 return new File(mContext.getFilesDir().getAbsolutePath(),mName);
 //return new File(Environment.getExternalStorageDirectory(),mName);		
}

public long getDataFileSize(){
 File file = getDataFile();
 return(file.exists())?file.length():0;
}

public Download(Context context, String url, String name, Events events){
mName	= name;
mHandler = new Handler(){
@Override
public void dispatchMessage(Message msg) {
if(mEvents==null)return;
switch(msg.what){
case 0:
 mEvents.onstart(msg.arg2);
 break;
case 1:
 mEvents.onprogress(msg.arg1, msg.arg2);
 break;
case 2:
 mEvents.onfinish((File)msg.obj);
 break;
}
}
};
mEvents = events;
mRunning = false;
mContext = context;
mUrl	 = url;
mCurrent = getDataFileSize();
mLength = 0;
}

public void start(){
new Thread(){	
@Override
public void run() {
if(mRunning)return;
 try {		
	DefaultHttpClient http	 = new DefaultHttpClient();
	HttpGet	 request = new HttpGet(mUrl);
	if(mCurrent>0){
	 request.addHeader("Range", "bytes=" + mCurrent + "-");
	}
	request.addHeader("Accept-Encoding","gzip, deflate");
	HttpResponse	response = http.execute(request);

	Header[] headers = response.getHeaders("Content-Encoding");
	InputStream is = response.getEntity().getContent();
	if (headers.length>0){
	 if (headers[0].getValue().toLowerCase().equals("gzip")){
	 is = new GZIPInputStream(is);
	 }
	}	

	Header[] range = response.getHeaders("Content-Range");
	if (range.length>0){
	 String s = range[0].getValue();
	 mLength = Integer.valueOf(s.subSequence(s.indexOf("/")+1, s.length()).toString());
	}else{
	 Header[] length = response.getHeaders("Content-Length");
	 if (length.length>0){	
	 mLength = Integer.valueOf(length[0].getValue());
	 }
	}

	byte[] buffer = new byte[1024];
	int len = 0;
	long	nexttime	= 0;
	mRunning = true;				
	mHandler.sendMessage(mHandler.obtainMessage(0, 0, (int)mLength));		
	RandomAccessFile fos = new RandomAccessFile(getDataFile(),"rw");
	fos.seek(mCurrent);
	while ((len = is.read(buffer)) != -1){
	 mCurrent +=len;
	 long time = SystemClock.elapsedRealtime();
	 if(nexttime<time){
	 mHandler.sendMessage(mHandler.obtainMessage(1, (int)mCurrent, (int)mLength));
	 nexttime = time + 1000;
	 }
	 fos.write(buffer, 0, len);
	 if(mRunning==false){
	 fos.close();			
	 break;
	 }
	}				
	fos.close();
	mHandler.sendMessage(mHandler.obtainMessage(1, (int)mCurrent, (int)mLength));

 }catch(Exception e){
	e.printStackTrace();
 }

 mHandler.sendMessage(mHandler.obtainMessage(2, getDataFile() ));	

}
}.start();	
}

public void stop(){
mRunning=false;
}

}

Mon problème est que le fichier ne s'enregistre pas sur la carte SD mais dans la memoire du téléphone.

J'ai aussi mis les deux permisions suivantes :

android.permission.INTERNET

android.permission.WRITE_EXTERNAL_STORAGE

J'aimerais savoir comment faire pour résoudre mon problème, auriez vous une solution svp ? Merci pour vos future réponse.

Modifié par jelven

Partager ce message


Lien à poster
Partager sur d’autres sites

Je fais un petit up

Dsl de déranger :unsure:

Partager ce message


Lien à poster
Partager sur d’autres sites

Vu que tu demandes explicitement à créer le fichier dans la mémoire interne, c'est normal que tu ai ce résultat, non ? ;)

public File getDataFile(){
	 return new File(mContext.getFilesDir().getAbsolutePath(),mName);
	 //return new File(Environment.getExternalStorageDirectory(),mName);			
	}

Modifie le code de cette méthode pour qu'elle retourne la référence à un fichier situé sur l'espace de stockage externe (ie décommente la ligne en commentaire, et ton fichier se trouvera alors à la racine de l'espace de stockage externe)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup !! j'ai donc changer le code comme ça :

public File getDataFile(){
	   //return new File(mContext.getFilesDir().getAbsolutePath(),mName);
	   return new File(Environment.getExternalStorageDirectory(),mName);				  
			}

est ce que c'est bon ? il me met une erreur si je laisse les 2 ligne sans // alors j'ai rajouter les // a l'autre ligne

tu peux me dire si c'est grave ?

Modifié par jelven

Partager ce message


Lien à poster
Partager sur d’autres sites

c'est normal que tu ai une erreur, tu ne peux pas avoir deux return consécutifs dans une fonction

Partager ce message


Lien à poster
Partager sur d’autres sites

ok merci beaucoup ! ça fonctionne super bien !

Partager ce message


Lien à poster
Partager sur d’autres sites

Je relance le sujet car j'ai une nouvelle question, j'aimerais que le fichier téléchargé se mette dans un dossier spécifique dans ma carte sd, comment je fais s'il vous plais ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu ajoutes le nom de dossier au path de ton File.

Par exemple :

new File(Environment.getExternalStorageDirectory()+"/sousdossier",mName);

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ton aide. ça fonctiionne mais que si le dossier existe déjà, comment faire pour que l'application créé le dossier lui même ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Utilise la méthode mkdir sur un fichier File qui représente ton dossier.

File f = new File(...);
if(!f.exist()){
f.mkdir();
}

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ta réponse mais je n'arrive pas à faire fonctionné ta méthode, comment ça marche ?

Partager ce message


Lien à poster
Partager sur d’autres sites

La syntaxe est peut etre pas exactement correct ! Mais en gros tu vérifie si ton fichier existe et si c'est pas le ceas tu utilise la méthode mkdir pour le créer ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Et dans le nom du fichier je met le nom du dossier ?

C'est bon ça fonctionne impec apparament !

Merci beaucoup !

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant