tp_thread_android
Thème : Remaniement et déploiement sur la plate forme Android du tp3 (déjà effectué sous J2SE)
Question1) Acquisition cyclique d'un capteur installé sur le web
Une valeur aléatoire est retournée lorsque ce capteur est déconnectéCe capteur est un DS2438 (ancêtre du DS1923) qui délivre le taux d'Humidité Relative d'un bureau au CNAM/Paris 75003. Il est relié au serveur lmi92.cnam.fr par un adaptateur port série <--> bus 1-Wire de Dallas Semiconductor/MAXIM. Il est accessible à l'URL : http://lmi92.cnam.fr/ds2438/ds2438/
Proposez ce service sur Android, le code original sera remanié, (attention à l'UIThread)
IHM/ Android : Une suggestion d'interface pourrait être l'affichage d'un texte contenant la valeur du capteur et une jauge reflétant la valeur lue,
L'acquisition cyclique débuterait par une action sur le bouton start.
A la fin d'une période d'acquisition, l'interface est à nouveau prête pour commencer un nouveau cycle. (Pendant l'acquisition le bouton start est inhibé.)
![]() |
![]() |
![]() |
Note: Permission : accès à internet, AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
Une proposition de squelette de programme pour l'activité pourrait être :
public class TpThreadQuestion1Activity extends Activity
{
private TextView tv;
private Button start;
private ProgressBar progressBar;public void onCreate(Bundle savedInstanceState) {...}
public void onClickStart(View v)
{ // attribut xml onClick
this.start.setEnabled(false);
Acquisition acquisition = new Acquisition();
}private class Acquisition ... implements Command<Float>, Runnable
{public void make(final Float f){
final String date = DateFormat.getTimeInstance().format(Calendar.getInstance().getTime());
// tv.setText("[" + date + "] ds2438.value : " + f);
// attention, attention ! ces 2 instructions auront une exécution incertaine ...
// progressBar.setProgress(f.intValue());
// la solution fait partie de la réponse à cette question});
}
public void run(){
HTTPSensorAndroid ds2438 = new HTTPSensorAndroid("http://163.173.228.92/ds2438/ds2438/");
try {
// Afin de vérifier que tout fonctionne tel quel ...
// tp.thread.question1.Main.main(new String[]{"http://lmi92.cnam.fr/ds2438/ds2438/"});CyclicAcquisition acquisition = new CyclicAcquisition(ds2438, ds2438.minimalPeriod(), this);
acquisition.start();
Thread.sleep(30000);
acquisition.stop();}catch (Exception e){
} ...
}
});
Question2) Lecture du fichier de mesures
Ajoutez une fonctionnalité à votre application permettant de lire le fichier de mesures généré au format HTML.
Suggestion d'interface : un nouveau bouton HTML view de visualisation de la page HTML a été ajouté
![]() |
Un clic sur le bouton
HTML view Suggestion d'interface résultante |
A l'activity ainsi déclenchée, est associée un processus
( et
sa DVM), (par défaut une activité utilise le
même processus que son initiateur)
Vérifiez le comportement analogue |
Ce fichier généré sur la SD-Card, est lu depuis une WebView dans une seconde activité et un processus lui est associé.
Extraits du fichier AndroidManifest.xml
Déclaration d'une activity au sein d'une application et création d'un processus dédié
<activity android:name=".WebResultActivity" android:process="tp.thread.webResult"></activity>
Permission : accès à la SD-Card
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
1) Extrait de code permettant d'écrire un fichier sur la SD-Card
private void writeHTML() throws IOException{
File root = Environment.getExternalStorageDirectory();
BufferedWriter bw = new BufferedWriter(
new PrintWriter(
new FileOutputStream(
new File(root, fileName + ".html"))));
2) Extrait de code permettant de lire un fichier HTML depuis la SD-Card et son affichage dans une webView (cf.méthode loadUrl)
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
webView.loadUrl("file:///"+ path + File.separator + nomDuFichier);