Application de mise à jour de fichiers

Fermé
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016 - Modifié par BunoCS le 22/06/2016 à 10:06
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016 - 22 juin 2016 à 12:02
Bonjour,
Je m'excuse de vous déranger, mais j'aurais besoin de votre aide !
Merci par avance !

En faite, j'ai une application mobile avec 13 boutons radios. Si je sélectionne le bouton radio 1 et que je clique sur valider, je souhaite afficher un fichier excel précis. Après un retour, si je sélectionne un autre bouton radio, il dois afficher un autre bouton radio.. En faite pour chaque bouton radio, je dois avoir 13 fichiers excel différent.

Donc en suivant quelques conseils, j'ai crée un dossier "assets":


dans ce dossier j'ai mis mes fichiers:


Donc le moment j'ai ceux-ci:


Mais j'ai mon fichier .ods qui n'est pas compris du logiciel:


Et donc pour afficher mes fichiers excel, j'ai crée une grande TextView:


Et donc voici pour le moment mon code de "Bureau1.java":
package com.example.administrateur.applicationdeux;

import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Button;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;


public class Bureau1 extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bureau_un);

try {

FileReader fr;
InputStream is = getAssets().open("Bureau1.txt");

//création de l'objet de lecture
File file = null;
fr = new FileReader(file);
String str = "";
int i = 0;
//Lecture des données
while((i = fr.read()) != -1)
str += (char)i;


//affichage
setContentView(R.layout.bureau_un);

TextView text = (TextView) findViewById(R.id.textView4);
text.setText(str);

setContentView(text);

}




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



/*catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
  • / } public String readFileAsString(String filePath) throws java.io.IOException { String essai = Uri.parse("file:///assets/Bureau1.ods").toString(); StringBuilder fileData = new StringBuilder(); BufferedReader reader = new BufferedReader(new FileReader(filePath)); char[] buf = new char[1024]; int numRead = 0; while ((numRead = reader.read(buf)) != -1) { fileData.append(buf, 0, numRead); } reader.close(); return fileData.toString(); }}


Bon comme vous l'avez compris, cela ne fonctionne pas... Le fichier excel ne s'affiche pas...
Quelqu'un aurait-il une idée ?
Merci beaucoup

J'ai utilisé ce tuto':
https://openclassrooms.com/forum/sujet/android-lire-un-fichier-20077
et ceci:
https://android-france.fr/2009/06/ecrire-et-lire-dans-un-fichier-avec-android/
A voir également:

19 réponses

BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
Modifié par BunoCS le 16/06/2016 à 14:56
Hello,

Plusieurs petites choses me chagrinent:
- le format ODS (Open Office) n'est pas forcément adapté à l'environnement mobile. Plutôt partir sur CSV
- le principe d'un fichier tableur est d'afficher les infos sous forme de tableaux. A mon avis, la
TextView
n'est pas adapté
- tu mets des ODS dans tes assets mais tu essaies d'ouvrir des TXT -> cela ne peut pas fonctionner
- inutile de créer x écrans
Bureau
. Plutôt créer un écran
Bureau
qui prend en paramètre le fichier à ouvrir.
- dans ton cas, un seul
setContentView()
. Tu peux supprimer ceux du bloc
try
.

@+ 
Buno, Modo CS-CCM 
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai... 
The urgent is done, the impossible is underway. For miracles, provide for a delay...
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 16/06/2016 à 15:09
Bonjour !
Déjà merci beaucoup pour ta réponse !

Bon j'ai changé le format en CSV.

En faite, vous me dîtes de ne créer qu'une classe "Bureau" donc plus général ?
Mais dans mon code principal, j'ouvre à chaque fois un bureau:
switch(choix)
{
case R.id.Bureau1 :
intent = new Intent(MainActivity.this, Bureau1.class);
startActivityForResult(intent, CODE_REQJEU);
break;
case R.id.Bureau2 :
intent = new Intent(MainActivity.this, Bureau2.class);
startActivityForResult(intent, CODE_REQJEU);
break;
case R.id.Bureau3 :
intent = new Intent(MainActivity.this, Bureau3.class);
startActivityForResult(intent, CODE_REQJEU);
break;
}


Et donc pour les "Layout" ?

Car pour moi, le TextView était juste une "place" que j'attribuais pour y aller par la suite mon fichier excel
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
16 juin 2016 à 15:24
Regarde ton code: si tes différentes Activity Bureau, ainsi que leurs layouts sont quasi identiques, il est plus judicieux de ne faire qu'une Activity en passant un ID pour savoir quel fichier charger (voir android.os.Bundle) putExtra()

Une TextView étant un composant graphique affiche du texte, il ne faut pas le voir comme "une place". Comment veux-tu afficher ton tableur?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 16/06/2016 à 15:44
Mmh je comprends ce que vous dîtes.. Mais j'ai commencé la programmation mobile il y a seulement trois semaines dans le cadre d'un stage de fin de 1ère année de BTS.. Et je manque de temps pour tout reprendre le code et faire comme vous dîtes avec l'id. Et je crains ne pas avoir les compétences pour, sachant que j'ai déjà eut énormément de mal à faire ce que j'ai là, et avec de l'aide d'autres personnes via les forums...

Ah d'accord...Effectivement, cela ne peut donc pas fonctionné... Je ne sais donc pas comment insérer mon fichier... Je voulais juste qu'en cliquant sur le bouton "valider" j'ai mon fichier excel qui apparaissait...
Il s'agit d'un fichier avec des noms et des voix...
Après comment comment l'afficher ? Je ne comprends trop votre question..
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908 > Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
16 juin 2016 à 15:44
Je ne te jettes pas la pierre, je t'expliques les bonnes pratiques. A mon avis, tu ne pas pas perdre plus de temps en changeant le code car au lieu de maintenir X classes (donc X fois un même bug potentiel) tu ne vas en maintenir qu'une.

Pour afficher ton tableur, tu as ici un exemple: https://javapapers.com/android/android-read-csv-file/
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
16 juin 2016 à 15:56
Oui je ne l'ai pas mal pris du tout, mais je suis incapable de le faire... Je sais que ça serait bcp plus simple niveau sécurité, optimisation etc... Mais vraiment j'ignore comment faire...Car en ne faisant qu'un seul id... Ça va changer mon switch...et donc je ne sais pas quoi mettre à la place... Je ne sais pas non plus trop comment fonctionne le "putExtra" j'ai lu ce qui était d'internet, mais voilà...

D'accord merci pour le lien, je vais regarder de ce pas.
Donc en faite eux dans leur MainActivity.java ils ont déjà mit des: listView
Mais moi j'en ai pas besoin dans ma classe principal, donc je les intègre dans mon Bureau1.java par expl ?
De même le "ItemArrayAdapter.java" que je peux aussi placer dans mon Bureau1.java

et donc après mettre listView dans le xml de mes bureaux ?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
16 juin 2016 à 16:26
Et je voulais savoir aussi, si l'application est mise sur un téléphone portable, et que je souhaite mettre à jour mon fichier excel depuis donc le pc. Sachant que seul quelques personnes auront l'application, je ne le mettrais pas sur google play.
Donc les quelques personnes à avoir l'application, donc comment faire pour mettre les fichiers à jour et que cela se mette à jour aussi sur les téléphones ?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
16 juin 2016 à 17:35
Bon alors, j'ai suivis vos conseils, et votre tuto'...

J'ai mis les fichiers à leur place:
Et j'ai clarifié mes classes et Layout.




J'ai crée une classe ItemArrayAdapter.java comme dit dans le tuto'


Mais il y a des erreurs je ne sais pas pourquoi. Le extends j'ai mis pareil que dans le tuto, car en essayant: extends AppCompatActivity ça a été pire..Mais je ne comprends pas pourquoi il n'accepte pas les types...

De même j'ai rajouté le item_layout.xml et le bureau.xml en y mettant bien le Layout.

Je n'ai rien remit dans mon MainActivity.java mais bien dans Bureau.java


Mais je ne vois non plus pourquoi il ne prend pas le format CSVFile


Après je ne sais pas trop, en cherchant, j'ai beaucoup "CSVReader reader" et non CSVFile, peut-être ça ?
Ou alors ici; https://www.codeproject.com/Questions/491823/Read-fWriteplusCSVplusinplusplusAndroid
Mais le CSVFile est directement allié à un chemin...
Mais je n'ai juste que pour lire et écrire.

Ou j'ai pu lire ici: https://www.codeproject.com/Questions/491823/Read-fWriteplusCSVplusinplusplusAndroid
Q'ils importaient un fichier CSV de 3 col.

De même: https://mkyong.com/java/how-to-read-and-parse-csv-file-in-java/
Le CSVFile est égal à un chemin d'accès :/





Et je voulais savoir aussi, si l'application est mise sur un téléphone portable, et que je souhaite mettre à jour mon fichier excel depuis donc le pc. Sachant que seul quelques personnes auront l'application, je ne le mettrais pas sur google play.
Donc les quelques personnes à avoir l'application, donc comment faire pour mettre les fichiers à jour et que cela se mette à jour aussi sur les téléphones ?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
17 juin 2016 à 09:11
https://parallelcodes.com/android-csv-file-import-to-sqlite-database/

Dans le milieu du site, ils parlent de "The csv file be of 3*3" pour importer les documents excel.
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
Modifié par BunoCS le 17/06/2016 à 11:20
Je vais essayer de répondre point par point et de ne rien oublier:

1. Je te conseille de regarder la doc des ArrayAdapter. C'est un objet qui permet de lier une vue (la ListView) à une source de données (ton tableau d'Objet). Le tuto n'est a priori pas à jour car il faut que tu donne un type à ton Adapter. Ici, ce sera
String[]
. Donc, dans l'extends, il faut mettre
ArrayAdapter<String[]>
. Un bon exemple ici

2. La classe
CSVFile
est fourni dans le tuto, dans la partie How to read CSV file

3. Pour la mise à jour, je t'ai déjà répondu

4. A propos du lien pour mettre un CSV dans une base de données, je te conseille de ne pas trop mélanger les tuto. Tu regardera cette partie dans une prochaine étape si vraiment tu en as besoin
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 17/06/2016 à 11:27
Ah oui désolée je n'avais pas vu la réponse... Car après ils veulent que tout les fichiers Excel modifiés, se modifient automatiquement dans l'application... Il faut donc que je fasse ceux-ci: "mettre sur un serveur avec une mécanique de webservices"...Surtout que je ne mets pas l'application sur google play...
Vous pourriez m'expliquer ce que c'est ?

C'est donc différent de si je mets sur google play ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
17 juin 2016 à 11:40
Non, cela n'a rien à voir avec la publication.
C'est assez simple à comprendre: vu comment tu gères tes fichiers aujourd'hui (dans le dossier raw), ils seront embarqués dans le binaire de l'application, donc non modifiables. Ils vont juste servir à de la consultation. 1er point: Si tu veux pouvoir les modifier, il faudra les enregistrer ailleurs sur l'espace mémoire du téléphone. 2e point: Si tu veux une synchronisation des fichiers avec d'autres personnes (c'est ce que je comprends finalement), il te faut les stocker sur un espace de stockage central, autrement dit un serveur accessible depuis internet.
Je ne sais pas de combien de temps tu disposes pour faire le développement mais ça peut être assez ardu de gérer cette synchronisation. Par exemple, comment faire si plusieurs personnes modifient la même cellule en même temps?
Personnellement, je pense que tu dépense de l'énergie pour rien. Google Sheet fait très bien ce que tu essaies de développer: vous posez vos fichiers "tableurs" sur un espace Google Drive avec les permissions qui vont bien pour tout le monde et chacun peut y accéder de n'importe où pour consulter et/où modifier.
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 17/06/2016 à 11:56
Ah oui..le tutoriel sert à mettre le CSV dans une base de donnée...effectivement ce n'est pas approprié...

J'ai donc fait les modifications..En mettant donc
extends ArrayAdapter<String[]>
Malgré tout il me met toujours une erreur sur le
return this.scoreList.get(index);
la même que plus haut...

Dans Bureau effectivement je n'ai pas vu la classe CSVFile j'en suis désolée.
Mais de même j'ai toujours le problème dans le boucle "for" comme cité plus haut..

Je dispose jusqu’au 4 juillet pour que tout soit opérationnel...

Si je comprends Google Sheet, est déjà une application, et on dépose les fichiers tableaux dessus, et les personnes peuvent déposer les fichiers excel, et les clients peuvent voir ces fichiers excel ???

Mais le problème, c'est qu'il me faut tout séparer en 13 bureaux (13 lieux différents) avec les informations sur les résultats des élections par partis...

En faite il y a une personne qui va recevoir les résultats de vote, et qui va modifier le fichier excel, en suite, les clients vont regarder sur leurs téléphones, le résultats des votes au fur et à mesure dans la partie de ville qui les intéresse (une des 13 parties). Donc le fichiers excel est modifié tous les 100 votes dépouillés.
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908 > Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
17 juin 2016 à 12:00
Lien Play Store vers Google Sheet
Je suis désolé de te dire cela mais pour ce genre de besoin, une application mobile n'est pas du tout adaptée...
Dès que l'on parle de centralisation de données, avec plusieurs participants, il faut penser web. Là, ton application mobile ne va pas adresser tous tes besoins. Il te faut nécessairement une partie web...
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
17 juin 2016 à 12:05
Bah après j'ai fais ce qu'ils voulaient...Ils m’ont dit qu'ils voulaient une application mobile qui est géré par une seule personne, l'application serait distribuée juste aux élus, qui suivraient tous les 100 votes les pourcentages des divers partis...

Comment ça une partie web ? Juste le serveur web alors pour récupérer les données ? Les mettre sur un serveur et les envoyer au téléphone ?

Après, je leur ai parlé d'un site web... Car je ne savais pas faire d'application mobile, le directeur m'a répondu qu'il n'était pas intéressé... Donc je suis partis sur ce qu'il y a demandé...
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908 > Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
17 juin 2016 à 13:52
Après, je leur ai parlé d'un site web
C'est effectivement la meilleure solution. Quitte à le faire en mode response design pour qu'il s'adapte aux mobiles. J'imagine que c'est trop tard pour changer du coup...

Comment ça une partie web ? Juste le serveur web alors pour récupérer les données ? Les mettre sur un serveur et les envoyer au téléphone ?
On va dire ça mais du coup, le format tableur n'est pas très adapté. Tu connais le format JSON?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
20 juin 2016 à 10:47
Hello,

OK, on va essayer d'avancer en mettant une alerte sur le fait que l'application peut ne pas répondre exactement au besoin.

Quelles sont les erreurs restantes?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
20 juin 2016 à 11:03
D'accord... Merci beaucoup...

Voici les erreurs affichées...


0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
20 juin 2016 à 11:30
OK.

Essaie de remplacer la déclaration de tes objets
List
par des
ArrayList<String[]>
:

private ArrayList<String[]> scoreList = new ArrayList();
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 20/06/2016 à 11:46
Pour ItemArrayAdapter, le code:
private ArrayList<String[]> scoreList = new ArrayList();

fonctionne. J'ai un peu de mal à comprendre, on a remplacé "List" par un tableau dynamique de chaîne de caractère..

Par contre pour Bureau.java il n'y a rien qui correspond à des tableaux :/
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908 > Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
20 juin 2016 à 11:50
Si tu regarde la doc, tu verra que ArrayList est un objet contrairement à List qui est une interface générique. Le fait de spécifier une ArrayList type les objets manipulés et évite les problèmes de cast, comme spécifié dans ton erreur.

Pour Bureau, c'est pareil: il faut changer le type de ton objet
scoreList
de la même façon.
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 20/06/2016 à 11:59
Bah j'avais trouvé sur internet la diffrence entre ArrayList et List; https://openclassrooms.com/forum/sujet/diffrence-entre-arraylist-et-list-41338

Oui c'est ce que j'ai fais pour Bureau... Mais j'ai toujours l'erreur avec le String..
Quand je fais ma déclaration, j'ai le "scoreList" qui se grise dans la déclaration... Quand s'il se grise c'est qu'il n'est pas utilisé, mais on l'utilise dans la boucle for
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 20/06/2016 à 16:09
Problème résolu pour le Bureau. Mauvaise manipulation de ma part.
Donc tout mes onglets fonctionnent.

Maintenant je dois utiliser le "JSON" ? Et je dois faire le serveur ?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
21 juin 2016 à 09:01
Puis en essayant de convertir un fichier csv en json... avec:
http://www.convertcsv.com/csv-to-json.htm



J'ai l'impression qu'il ne prend pas tous les caratères...
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
Modifié par BunoCS le 21/06/2016 à 09:32
Difficile de repartir sur de bonnes bases lorsque le développement est bien avancé et que le besoin n'a pas été clairement identifié au début... Idéalement, si j'ai bien compris, tes fichiers CSV ne servent à rien en fait. Il faudrait, à chaque lancement de l'application, aller chercher sur le serveur des dernières données à jour. D'ailleurs, as-tu pensé comment faire les mises à jour? Quand faire les mises à jour? De manière automatique ou manuelle?

Bref, pour répondre à ta question: Pour moi, la copie de fichiers est un travail à faire une seule fois, lors de l'initialisation de l'application, suivant un algo du type:

- lancement de l'appli
- si les fichiers ne sont pas dans le stockage de l'appli
. pour chaque fichier dans le dossier "raw"
. récupérer le contenu du fichier
. créer un fichier dans le stockage de l'appli
. fin pour
- sinon
. vérifier la date de dernière mise à jour (info intéressante à stocker)
. si les données sont trop vieilles
. récupérer les dernières infos depuis le serveur
. mettre à jour les fichiers
. fin si
- fin si
- afficher le 1er écran
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 21/06/2016 à 09:58
Bah en faite une personne va devoir modifier le fichier tableur tous les 100 votes comptabilisés, elle va donc changer le fichier excel avec les nouvelles valeurs et l'enregistrer. Ce nouveau fichier excel modifié depuis l'ordinateur devra être envoyé sur l'application. Ainsi le client en actualisant va pouvoir voir les nouveaux résultats...

Les MAJ seront manuelles, puisque c'est une personne qui va rentrer les nouvelles valeurs des résultats des votes

Bah si il me faut les 13 fichiers excel puisque que chaque fichiers sera modifiés manuellement en fonction des parties de la ville et des résultats jusqu'à la fin du dépouillement

Mais effectivement, il me faut un timer, pour que les nouvelles données qui ont été saisit par l'admin et envoyé sur l'application s'actualise sur cette application
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
21 juin 2016 à 10:18
Ce nouveau fichier excel modifié depuis l'ordinateur devra être envoyé sur l'application
On est d'accord que ce n'est pas possible sans une solution de Push, hein?

Ainsi le client en actualisant va pouvoir voir les nouveaux résultats...
Pour toi, techniquement, tu entends quoi par "actualiser"? Appuyer sur un bouton? Si oui, tu vas faire quoi au niveau code?

Les MAJ seront manuelles, puisque c'est une personne qui va rentrer les nouvelles valeurs des résultats des votes
Je parlais des MAJ côté application. Autrement dit, si l'utilisateur affiche le Bureau4, quand et comment son écran va être mis à jour?

Bah si il me faut les 13 fichiers excel
Soit. Mais avec quelles données seront-ils initialisés?

Mais effectivement, il me faut un timer,
Donc, tu partirais sur une solution automatique: toutes les X secondes, tu iras chercher de nouvelles données sur le serveur. C'est bien ça?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 21/06/2016 à 10:45
EDIT:
Notif' Push effectivement avec ce que je viens de lire: https://openclassrooms.com/forum/sujet/actualisation-automatique-des-donnees-de-mon-app-android-67685
Mais/Ou Timer
Donc plus un timer qu'une notif' push non ?

Donc ceci: https://stackoverflow.com/questions/6134832/auto-refresh-the-activity ??
Mais c'est pour un contenu internet et non une application.
Ou il y avait ceci: https://forums.commentcamarche.net/forum/affich-29099267-rafraichir-des-donnees-sous-android

- Si j'ai bien compris qu'il fallait un serveur pour que les fichiers excel modifiés depuis le pc soit ensuite envoyé sur le serveur, puis le serveur renvoie les fichiers excel modifiés sur l'application mobile.

- Non ça ne sera pas appuyer sur un bouton, car si les personnes ne pensent pas à appuyer sur le bouton, elles ne verront jamais les nouveaux résultats des élection...
Oui toutes les X secondes, l'application devra aller voir, si le fichier excel à été mis à jour ou non, et renvoyé ou non les nouveaux résultats.

<blockquote>Soit. Mais avec quelles données seront-ils initialisés? </blockquote>
Je n'ai pas compris votre question...
Les fichiers excel seront dans le dossier raw...et ces fichiers seront modifiés..puis renvoyés...
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
21 juin 2016 à 10:59
Ok, le timer correspond effectivement à ton besoin. Plutôt avec le
Handler
et le
Runnable
, c'est plus propre

Les fichiers excel seront dans le dossier raw...et ces fichiers seront modifiés..puis renvoyés...
C'est là qu'on ne se comprend pas. Tu ne peux pas modifier des fichiers stockés dans le dossier raw. Ces fichiers servent principalement à l'initialisation de ton application et contiennent des données statiques. Dans ton cas, tu devrais obligatoirement copier tes fichiers dans le répertoire de l'application pour pouvoir les modifier. On est d'accord que cette modification sera faite dans le Runnable? Donc, toutes les X secondes? Suivant l'algo suivant:

- toutes les X secondes, faire
. télécharger les nouveaux fichiers CSV (oublie le JSON, ce sera plus compliqué)
. remplacer les fichiers CSV stockés dans le répertoire de stockage avec ceux téléchargés
. rafraichir l'écran

0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 21/06/2016 à 11:59
Oui j'avais bien compris que l'on ne peut pas modifier les fichiers qui sont dans le dossier raw, car avec la compilation ces fichiers ne sont plus accessibles, c'est que vous aviez dit et que j'avais compris.

Juste l'admin devra alors aller où pour modifier ces fichiers ?

Donc... de ce que j'ai compris je dois utiliser les thread

D'après l'exemple je dois créer une nouvelle classe qui hérite de Thread. Ensuite je dois overide la methode run(). (d'où ma question de savoir si je mets le code dans le MainActivity.java, ou si je recrée une nouvelle classe "Temps"avec un extends?)

Si je suis le tuto' avec une nouvelle classe:

public class Temps extends Thread
{
@Override
new Thread(new Runnable() {
         public void run()
          {
          while(true)
               {
               try
                    {
              Thread.currentThread().sleep(n);
                    }//FinTry
               catch (InterruptedException ie)
                    { }//FinCatch

           //For toutes les X secondes, faire
           {
              //télécharger les nouveaux fichiers CSV 
              //remplacer les fichiers CSV stockés dans le répertoire de stockage avec ceux téléchargés
             //rafraichir l'écran
           
           }//FinFor
              
              }//FinWhile
          }//FinRun
 }).start(); //FinThread
}//FinClassTemps


Ca irait ainsi ?
Mais si je pointe vers Thread, faut que je crée une classe Thread ?

D'après ceci: https://www.developpez.net/forums/d45374/java/general-java/api-standards-tierces/action-intervalle-regulier/
et
https://openclassrooms.com/fr/courses/2023346-creez-des-applications-pour-android/2027457-le-travail-en-arriere-plan
et
https://stackoverflow.com/questions/11687011/run-loop-every-second-java
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
21 juin 2016 à 11:59
Juste l'admin devra alors aller où pour modifier ces fichiers?
J'ai un peu peur quand tu dis 'admin'. C'est qui? Il fait quoi? On est d'accord qu'il ne modifie pas les fichiers depuis l'application? Idéalement, il met à jour les fichiers CSV sur le serveur et c'est tout. Sinon, s'il le fait depuis l'application, ça va poser quelques soucis de gestion de droits/utilisateur...

Pour le timer: ceci est largement plus simple, non?
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 21/06/2016 à 12:06
Fin admin, la personne qui va modifier lors des élections le fichier tableur avec les nouvelles valeur.
Les fichiers excel ne doivent pas être modifié de l'application. L'application sert juste de visuel pour voir les résultats des élections.
Non l'application sera juste pour voir les résultats, rien de plus.

D'accord du serveur directement.
Oui j'avais trouvé ceci... Mais je l'ai enlevé car il utilise des Handler, et vous disiez que c'était moins bien... Donc j'ai trouvé les thread pour gérer ceci...Et sur ce lien, j'avais vu que c'était pour recharger des pages internet... Et non une application depuis un serveur.. Quoique...là on aura un serveur aussi...
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
21 juin 2016 à 14:25


Alors j'ai déclaré le Handler, et le refresh... J'ai mis le code dans le OnCreate, et j'ai crée: private final Runnable m_Runnable = new Runnable()

Mais il me reste quand même une erreur:


Il me dit qu'il attend un nom de classe... Faudrait-il que je mette ce code dans les
case
pour rafraîchir chaque bureau ?
Ou que je mette plus globalement Bureau...


Ou le CSVFile ? Pour rafraîchir les fichiers CSV ?
Parce que j'ai l'impression que le format CSV n'est pas reconnu par Android, ça ira tout de même au moment de la compilation ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
Modifié par BunoCS le 21/06/2016 à 14:38
Quand tu as un souci, n'hésites pas à regarder la doc:
Toast.makeText() attend, en 1er paramètre, un
Context
. La classe Activity dérivant de Context, tu dois donc mettre
MainActivity.this
.

@+ 
Buno, Modo CS-CCM 
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai... 
The urgent is done, the impossible is underway. For miracles, provide for a delay...
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 21/06/2016 à 15:02
Ah d'accord... Désolée je ferais plus attention.. =S
Mais donc ce code va permettre de rafraîchir mon activité ?

Car là le code n'est pas complet; il me reste ceci à mettre en place:

- toutes les X secondes, faire
--> . télécharger les nouveaux fichiers CSV (oublie le JSON, ce sera plus compliqué)
--> . remplacer les fichiers CSV stockés dans le répertoire de stockage avec ceux téléchargés
. rafraîchir l'écran

dans le code actuel, parce que là, j'ai bien le: toutes les X secondes, faire
et le rafraîchir l'écran

Il faut maintenant que je m'occupe des fichiers CVS ?


et par contre, je ne comprends ce que vous entendez par "télécharger les nouveaux fichiers CSV" ? :/
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
21 juin 2016 à 15:13
Attention, tu ne rafraichis rien là. Tu as juste: "Toutes les 5s, j'affiche un Toast". Ce n'est pas ce que tu veux. Il te faut une méthode qui va chercher les nouveaux fichiers CSV. Il faut, bien évidemment, les télécharger pour pouvoir mettre à jour ceux de l'application sinon, comment veux-tu faire?

Regarde ici pour le téléchargement. Par contre, cela sous-entend que tu as l'url des fichiers CSV.
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
21 juin 2016 à 15:54
D'accord.. Mais par contre je n'ai pas l'URL des fichiers CSV, vu que je ne suis pas sur serveur, et de ce que j'ai pu lire:
https://docs.oracle.com/javase/tutorial/networking/urls/creatingUrls.html
https://developer.android.com/reference/java/net/URL.html

Il faut qqch qui pointe vers www

Car faire qqch du genre:
URL url = new URL("AndroidStudioProjects\\Elections\\app\\src\\main\\res\\raw");

ne peut pas fonctionner vu que là c'est un chemin

Donc pour télécharger mes fichiers, il faudrait que j'utilise ceux-ci :
 File file = new File("c:/newfile.txt");
Et
FileOutputStream



https://www.developpez.net/forums/d999026/java/developpement-mobile-java/android/telechargement-fichier-partir-d-url/
Il utilise aussi
FileOutputStream


Et donc vu que je n'ai pas l'URL, j'utilise ceci ? Ou alors attendre de créer le serveur ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908 > Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
21 juin 2016 à 16:24
Il te faut les urls. Soit tu attends le serveur, soit tu peux commencer en mettant une adresse bidon (tu te mets les fichiers sur un Google Drive ou autre et tu récupères leurs urls)
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
21 juin 2016 à 17:15
J'ai déclaré :
private static Context CONTEXT;

En lisant la doc' là:
https://developer.android.com/reference/android/content/Context.html

J'ai implémenté une méthode:
public static Context getAppContext()
    {
        return MainActivity.CONTEXT;
    }


Mais je ne sais pas si cela est nécessaire...

private final Runnable m_Runnable = new Runnable()
    {
        public void run()
        {
            public boolean downloadFile(final String path)
            {
                try
                {

                    URL url = new URL(path);

                    URLConnection ucon = url.openConnection();
                    ucon.setReadTimeout(5000);
                    ucon.setConnectTimeout(10000);

                    InputStream is = ucon.getInputStream();
                    BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);

                    File file = new File(CONTEXT.getDir("filesdir", Context.MODE_PRIVATE) + "C:\\Users\\Administrateur\\AndroidStudioProjects\\Elections\\app\\src\\main\\res\\raw");
                    //getDir: permet de créer un fichier ou un répertoire dans la mémoire interne

                    if (file.exists()) {
                        file.delete();
                    }
                    file.createNewFile();

                    FileOutputStream outStream = new FileOutputStream(file);
                    byte[] buff = new byte[5 * 1024];

                    int len;
                    while ((len = inStream.read(buff)) != -1) {
                        outStream.write(buff, 0, len);
                    }

                    outStream.flush();
                    outStream.close();
                    inStream.close();


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

                return true;

            }//FinBool
        }//FinRun
    };//runnable


Après le code pour télécharger les fichiers dans la méthode du timer...pour que justement tout s'actualise, et télécharge ou non les fichiers nécessaire... Mais je ne sais pas si c'est correct de faire ainsi.

Car les "return" n'accepte pas d'être dans un void.. Ce qui "normal" donc peut-être ne pas tout imbriquer ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
21 juin 2016 à 18:02
Plusieurs choses qui ne vont pas:
- ton context n'est pas initialisé...et tu fais le travail pour rien. Tu as plusieurs méthodes à ta disposition:
getContext()
,
getApplicationContext()
ou bien, tout simplement
TonActivity.this
.
- il ne faut pas imbriqué plusieurs méthodes!!
run()
est une méthode et
downloadFile()
en est une autre! Cela ne s'imbrique pas! Dans
run()
, il faut appeler
downloadFile()
. (On sent la fatigue de la journée là)
- ton chemin est faux! tu as juste à faire
new File(context.getFilesDir(), "ton_nom_de_fichier")

- note bien que dans le paramètre
path
, tu passera l'url de ton fichier sur ton serveur
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 22/06/2016 à 10:03
Bonjour,

--> Donc si j'ai bien compris, pour l'initialisation de context, je dois avoir ceci:
Context CONTEXT = MainActivity.this;

https://stackoverflow.com/questions/17340265/is-it-required-to-initialize-context-twice-in-android
Et donc j'ai enlevé ma méthode:
public static Context getAppContext()
    {
        return MainActivity.CONTEXT;
    }


--> Les méthodes: downloadFile & Runnable / Run sont toutes dans mon MainActivity.java
Donc je vais juste appeler d'une méthode à l'autre et pas appeler une méthode dans une autre classe...Car sur internet je trouve beaucoup d'explication sur ce genre de cas, j'ai donc peur d'avoir fait une boulette en mettant tout dans la même classe.

Parce que donc pour appeler une fonction:
public void appelMethB()
{
    B b = new B();
    b.fct1();
}


public huile
{
      testerleshuile(e1);
}

Mais donc pour ce dernier code, il me faudrait un constructeur...ce que je n'ai pas pas :S c'est ce qu'il faut que je fasse ?

Parce sinon, ce qui est dit aussi: "Pour faire un appel d'une méthode d'une autre classe sans instancier celle ci, la méthode doit être déclarée avec le mot clef "static"."

Mais c'est toujours d'une méthode à l'autre...

https://www.developpez.net/forums/d397324/java/general-java/langage/introspection-appel-methode-d-interface/

Ah ou utiliser l'introspection ?

http://fr.androids.help/q21013

public class Service2 extends Service {
// Méthodes accessibles du service
 public interface Service2Interface {
public int getInfo();
public Service2 getService();
 }
}

Ou alors ainsi ?
public int getInfo();
public Service2 getService();
sont des "méthodes exposées"

https://forums.commentcamarche.net/forum/affich-37622112-java-les-methodes


J'ai essayé plusieurs méthodes... Après je voudrais votre avis...

De plus quand dans le lien au-dessus il demande des arguments... Sauf que l'argument:
public boolean downloadFile(final String path)

la "Path", je le change ici:
URL url = new URL("http://example.com/");

Donc je ne sais plus trop quoi mettre, j'avais pensé à mettre "url" à la place de "path" mais ce n'est pas du tout ça...

Ou comme vous disiez mettre l'url du fichier à la place de l'arg' path:
public boolean downloadFile(final String "http://example.com/")


Mais dans pour l'appel de la méthode mettre en arg':
(String "http://example.com/")
?


--> Et je voudrais savoir si j'appelle bien la méthode Handler ?
Car sur internet il l'a présente ainsi:
final Handler handler = new Handler();


et dans mon cas je l'appelle ainsi:
this.mHandler = new Handler();
        this.mHandler.postDelayed(m_Runnable,5000);


--> Je viens de réaliser aussi que je n'ai pas de
public static void main (String[]args)
dans mon code actuel :/


--> Pour le chemin: "ton_nom_de_fichier" la problème c'est que c'est 13 fichiers, pour ça...
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908
Modifié par BunoCS le 22/06/2016 à 10:07
Attention à ne pas t'éparpiller... En cherchant trop d'exemple sans savoir quoi faire, tu as te mélanger les pinceaux. Par exemple, tu me parles de
Service
(tu n'en as pas besoin), d'
interface
(là aussi, pas besoin), de
main
(spécifique Java mais pas Android)... N'hésites pas à te poser, et à noter l'algorithme dont tu as besoin sur une feuille de papier: ça aide à réfléchir...

Je suis parti du principe que tu avais les bases de la programmation objet, mais je vois que ce n'est pas forcément le cas... Tu sais comment passer des paramètres à une méthode?

Je vais te faire un squelette de code.

public Class Bureau extends AppCompatActivity {
// Constant
private static final int REFRESH_TIME = 5000; // en ms
// Data
private String mPath;
private final Handler mHandler;
private final Runnable mRunnable;

// Livecycle
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.bureau);
  
  // ici, tu récupères le numéro du bureau dans les paramètres de l'Intent
  // à partir de ce numéro, tu initialises l'url dans mPath

  //création de la routine à lancer toutes les 'REFRESH_TIME' (ici 5s)
  mRunnable = new Runnable() {
    public void run() {
      downloadFile(mPath);
      refreshScreen();

      mHandler.postDelayed(mRunnable, REFRESH_TIME);
    }
  }

  //lancement du timer
  mHandler = new Handler();
  mHandler.postDelayed(mRunnable, REFRESH_TIME);
}

// Methods
private void downloadFile(String path) {
//ici le code de téléchargement du fichier
//...
URL url = new URL(path);
//...
}

private void refreshScreen() {
//ici le code de rafraichissement de l'écran
}
}


Edit: j'ai renommé le sujet du topic pour qu'il colle mieux à la réalité ;)

@+ 
Buno, Modo CS-CCM 
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai... 
The urgent is done, the impossible is underway. For miracles, provide for a delay...
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
Modifié par Haelera le 22/06/2016 à 10:19
Ah d'accord... Désolée...

Je vais regarder, par contre j'ai une question, car vous avez mit
public Class Bureau

Mais en faite moi tout ce qui est
public Class Bureau
;
Runnable
&
downloadFile
je l'ai mis dans MainActivity.java, il faut donc tout que je remette dans Bureau.java ?


"Tu sais comment passer des paramètres à une méthode? " C'est-à-dire ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 908 > Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
22 juin 2016 à 10:45
A toi de choisir: soit tu mets tout dans MainActivity, et tu devras faire le travail 13 fois car tu as 13 fichiers, soit tu mets dans Bureau, et tu ne fera le travail que lorsque ce sera nécessaire.

Laisses tomber ma dernière remarque pour l'instant...
0
Haelera Messages postés 32 Date d'inscription jeudi 16 juin 2016 Statut Membre Dernière intervention 22 juin 2016
22 juin 2016 à 12:02
D'accord, donc je mets dans Bureau.

Par contre, pour ceci:
private void downloadFile(String path) {    }

Si je mets plutôt:
public boolean downloadFile(String path){    }


Car le
return false;
et le
return true;
, ne peuvent pas retourner de valeur à partir d'une méthode de type void..


Ici:
private final Handler mHandler;
    private final Runnable mRunnable;

Ca me dit que la variable peut ne pas avoir été initialisé... Je ne comprends le sens de la phrase...
Car quand j'utilise l'aide, il me dise de les ajouter dans un constructeur, c'est ce qu'il faut rajouter ?

Donc si j'ai bien compris avec ce code-ci:
Bundle extras = getIntent().getExtras();
        if (extras != null)
        {
            int id = extras.getInt(EXTRA_ID);
            // ici, tu es capable, en fonction de l'id, de savoir quel fichier est à charger
        }//FinIf

        listView = (ListView) findViewById(R.id.listView);
        itemArrayAdapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_layout);

        Parcelable state = listView.onSaveInstanceState();
        listView.setAdapter(itemArrayAdapter);
        listView.onRestoreInstanceState(state);

        InputStream inputStream = getResources().openRawResource(R.raw.Bureau1);
        CSVFile csvFile = new CSVFile(inputStream);
        ArrayList<String[]> scoreList = new ArrayList();

        for(String[]scoreData:scoreList)
        {
            itemArrayAdapter.add(scoreData);
        }//FinFor


Je ci, tu récupères le numéro du bureau dans les paramètres de l'Intent

Maintenant, je dois le terminer avec: à partir de ce numéro, tu initialises l'url dans mPath
C'est ça ?


Pour
postDelayed
J'ai le message que je ne peux pas résoudre la méthode...
Il dise ici: https://stackoverflow.com/questions/30312431/postdelayed-method-not-recognized
Que je dois mettre postDelayed à l'intérieur de la méthode showResult () pour qu'il soit reconnu...Mais j'ai un doute que ce soit cela dans mon cas

Puis pour le lancement du timer sur le
new Handler();
ça me met que Handler ne peut pas être instancié..
Alors que pourtant ici, il font pareil: https://stackoverflow.com/questions/28252400/cannot-resolve-method-postdelayed

Mais ici: https://stackoverflow.com/questions/19873063/handler-is-abstract-cannot-be-instantiated
Ils y mettent trois méthodes, et dans l'aide d'android de même, il faut donc je les rajoute



Car comme vous l'avez dit, ce n'est qu'un squelette, il faut que que je l'étoffe
0