Comme l'a dit grunk, a partir du moment ou ça marche en wifi malgré le VPN tu ne devrais avoir aucun soucis à faire fonctinner cela en 4G avec le VPN actif.
Version imprimable
Comme l'a dit grunk, a partir du moment ou ça marche en wifi malgré le VPN tu ne devrais avoir aucun soucis à faire fonctinner cela en 4G avec le VPN actif.
Re bonjour,
Mon appli tourne sans problème en 4g et en wifi.
Comme j'upload des fichier de 4-5 mo à partir du téléphone j'aimerais mettre en place un système qui me permet de déterminer quand la tache est terminée.
Pour cela j'utilise :
- onPreExecute : Pour afficher toast indiquant le début du transfert.
- onPostExecute : Pour indiquer quand le traitement est terminé.
Code:
1
2
3
4
5
6 @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(context, "Début transfert", Toast.LENGTH_LONG).show(); }
Code:
1
2
3
4
5 @Override protected void onPostExecute(String result) { Toast.makeText(context, "Upload OK ", Toast.LENGTH_LONG).show(); }
Ceci fonctionne.
J'aimerais aller un cran plus loin et savoir s'il est possible d'afficher l'avancement de l'upload via une barre de progression ?
Je pensais utiliser onProgressUpdate :
Deux questions à ce sujet :Code:
1
2
3
4
5
6 @Override protected void onProgressUpdate(Integer... values){ super.onProgressUpdate(values); // Mise à jour de la ProgressBar ...... }
1 -Comment récupérer la ProgressBarre du context dans l'AsyncTask ?
Elle est déclarée dans la mainActivity :
Sauf qu'ensuite "barre" n'est plus connue.Code:ProgressBar barre = findViewById(R.id.barre);
J'ai essayé avec :
puisCode:
1
2
3
4 public UploadFTP(Context applicationContext) { this.context = applicationContext; }
Mais barre est inconnue..Code:context.barre.setProgress(values[0]);
2 -Avec quoi alimenter le publishProgress dans le doInBackground ?
L'avancement des octets transférés ? Comment récupérer cette donnée ?
Merci d'avance,
Evo
FTPClient fonctionne avec un listner pour gérer la progression : CopyStreamListener
Il faut donc créer un listener et l'associer à ton client FTP via setCopyStreamListener() et gérer ta barre de progression dans ce listener.
Un exemple de mise en place ici
Je suis vraiment une quiche..
J'arrive pas du tout à avancer :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 try { FileInputStream img = new FileInputStream(new File(params[0])); mFTPClient.storeFile(params[1], img); CopyStreamAdapter streamListener = new CopyStreamAdapter() { @Override public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { int percent = (int)(totalBytesTransferred*100/img.length()); publishProgress(percent); } }); mFTPClient.setCopyStreamListener(streamListener);
J'ai ajouté ceci dans le DoinBackgroung.
Cependant CopyStremAdapter n'est pas reconnu: "cannot resolve symbol..."
J'ai ajouté dans le package :
Code:
1
2 import org.apache.commons.net.util.ListenerList; import java.util.EventListener;
J'ai rajouté :
Code:
1
2 import org.apache.commons.net.io.*; import org.apache.commons.net.ftp.*;
Reste setCopyStreamListener qui n'est pas reconnu:
Code:mFTPClient.setCopyStreamListener(streamListener);
Je suis toujours bloqué alors je change mon fusil d'épaule.
Plutôt que de faire joujou avec une barre de progression, je souhaite tout simplement afficher dans un TexView un "OK" pour annoncer que l'upload est terminé.
Actuellement je fait :
Le TOAST fonctionne seul, mais il ne faut pas le louper...Code:
1
2
3
4
5
6
7
8
9 @Override protected void onPostExecute(String result) { Toast.makeText(context, "Upload OK ", Toast.LENGTH_LONG).show(); activity.setContentView(R.layout.activity_main); TextView res = this.activity.findViewById(R.id.res); res.setText("Transfert OK"); }
J'obtiens une erreur :
FATAL EXCEPTION: main
Process: com.evo.evoftpupload, PID: 32492
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.Activity.setContentView(int)' on a null object reference
Du coup j'aimerais savoir si il est possible d'utiliser findViewById dans une une AsyncTask qui n'appartient pas à la classe principale ?
Merci d'vaance,
Bon j'ai réussi à trouver.
Ça fonctionne bien.
Du coup comme il me reste encore un peu de temps je reviens sur la barre de progression.
J'écris :
Mais j'ai un message d'erreur sur la ligne :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 FileInputStream img = new FileInputStream(new File(params[0])); mFTPClient.storeFile(params[1], img); CopyStreamAdapter streamListener = new CopyStreamAdapter() { @Override public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { int percent = (int) (totalBytesTransferred * 100 / mFTPClient.getBufferSize()); publishProgress(percent); } }; mFTPClient.setCopyStreamListener(streamListener); Log.d(TAG, "fichier stocké"); img.close(); mFTPClient.logout(); mFTPClient.disconnect();
mFTPClient.setCopyStreamListener(streamListener);
Message : "Cannot resolve method 'setCopyStreamListener(org.apache.commons.net.io.CopyStreamAdapter)'
Je comprends pas pourquoi...
C'est une histoire de bibliothèque ?
C'est effectivement un problème de bibliothèque ou d'import manquant.
Tu saurais laquelle ?
Ben c'est commons.net d'apache.
Ajoute la ligne suivante dans les dépendances gradle de ton fichier build.gradle du module :
.Code:implementation 'commons-net:commons-net:3.6'
Normalement ça devrait marcher.
Salut,
Merci pour la réponse, mais ça ne fonctionne pas.
Même erreur sur la ligne avec dans le build.gradle(Module: app)
Code:implementation 'commons-net:commons-net:3.6'
Bonjour, désolé de déterrer la discussion.
j'essaie de faire comme toi mais moi je dois envoyer un simple fichier txt sur un ftp.
problème, je sais pas comment remplacer ton code pour l'adapter au miens...
pourtant tout est bien expliqué.
Là où je galère c'est la gestion du système, des répertoires etc.
Merci