Le forum a été mis à jour! (lire la suite...)
Sign in to follow this  
Followers 0
jelven

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

13 posts in this topic

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.

Edited by jelven

Share this post


Link to post
Share on other sites

Je fais un petit up

Dsl de déranger :unsure:

Share this post


Link to post
Share on other 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)

Share this post


Link to post
Share on other 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 ?

Edited by jelven

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

ok merci beaucoup ! ça fonctionne super bien !

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other sites

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

Par exemple :

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

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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 ;)

Share this post


Link to post
Share on other sites

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

C'est bon ça fonctionne impec apparament !

Merci beaucoup !

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0