Aller au contenu

Bienvenue sur le forum de FrAndroid !

Nous sommes une communauté dédiée à Android et tout ce qui gravite autour. Si vous cherchez à tirer le meilleur parti de votre appareil, à le personnaliser, à ajouter des fonctions ou simplement à avoir des réponses à vos questions.

Rejoignez-nous. C'est gratuit!

Connexion Inscription

Photo

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


  • Merci de vous connecter pour répondre
12 réponses à ce sujet

#1
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
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, 21 August 2012 - 20:13.


Publicité

edelalife

#2
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
Je fais un petit up

Dsl de déranger :unsure:

#3
chpil

chpil

    RdS Développement

  • Responsable de section
  • 891 messages
  • LieuRennes
  • Modèle:Nexus 4 - Nexus 7 - Minix X5
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)

#4
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
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, 06 April 2012 - 16:54.


#5
chpil

chpil

    RdS Développement

  • Responsable de section
  • 891 messages
  • LieuRennes
  • Modèle:Nexus 4 - Nexus 7 - Minix X5
c'est normal que tu ai une erreur, tu ne peux pas avoir deux return consécutifs dans une fonction

#6
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
ok merci beaucoup ! ça fonctionne super bien !

#7
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
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 ?

#8
Substitut

Substitut

    Membre avancé

  • Membre
  • 66 messages
Tu ajoutes le nom de dossier au path de ton File.
Par exemple :
new File(Environment.getExternalStorageDirectory()+"/sousdossier",mName);


#9
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
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 ?

#10
Substitut

Substitut

    Membre avancé

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

File f = new File(...);

if(!f.exist()){

f.mkdir();

}



#11
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
Merci pour ta réponse mais je n'arrive pas à faire fonctionné ta méthode, comment ça marche ?

#12
Substitut

Substitut

    Membre avancé

  • Membre
  • 66 messages
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 ;)

#13
Jelven38

Jelven38

    Android à poil bleu

  • Membre
  • 298 messages
  • Marque:LG Electronics
  • Modèle:LG Optimus L7 (P700) | LG GT540
Et dans le nom du fichier je met le nom du dossier ?

C'est bon ça fonctionne impec apparament !
Merci beaucoup !




0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)