Aller au contenu

Particularités d'un projet android


Leavzou

Recommended Posts

Bonjour tout le monde !

Ayant fait récemment l'acquisition d'un SGSII, et étant plutôt adepte du monde de l'informatique et de programmation, je me suis penché sur le développement d'applications mobile. En tant que partisant de l'univers linux et de tout ce qui touche aux logiciels libres, je me suis naturellement penché vers Android.

Je développe initialement mes programmes en C++, et la transition vers le Java s'est fait assez naturellement et rapidement.

Seulement voilà, ça fait une semaine que je tourne en rond, uniquement pour LANCER mon application fonctionnant parfaitement bien en Java sur l'émulateur Android. C'est une application toute bête, pour récupérer et afficher un flux RSS.

Je ne peux pas mettre le code ici pour le moment car je ne sais pas comment faire, si quelqu'un peut m’expliquer j'éditerais le message.

Le programme est composé de :

-1 package contenant une classe et ses méthodes

-1 autre package(?), qui est celui de base crée avec un projet android (avec @override, toossa), où une fonction de la classe ci-dessus est appellée.

Je rappel que l'application fonctionne parfaitement bien sous un projet Java... (j'utilise bien l'API requis pour les packages importés, et j'ai bien autorisé l’accès à internet dans le manifest).

Le message d'erreur au lancement de l'application sous l'émulateur Android est "The application has stopped unexpectedly. Please try again"

Merci d'avance ! :D

Lien vers le commentaire
Partager sur d’autres sites

Bonjour tout le monde !

Ayant fait récemment l'acquisition d'un SGSII, et étant plutôt adepte du monde de l'informatique et de programmation, je me suis penché sur le développement d'applications mobile. En tant que partisant de l'univers linux et de tout ce qui touche aux logiciels libres, je me suis naturellement penché vers Android.

Je développe initialement mes programmes en C++, et la transition vers le Java s'est fait assez naturellement et rapidement.

Seulement voilà, ça fait une semaine que je tourne en rond, uniquement pour LANCER mon application fonctionnant parfaitement bien en Java sur l'émulateur Android. C'est une application toute bête, pour récupérer et afficher un flux RSS.

Je ne peux pas mettre le code ici pour le moment car je ne sais pas comment faire, si quelqu'un peut m’expliquer j'éditerais le message.

Le programme est composé de :

-1 package contenant une classe et ses méthodes

-1 autre package(?), qui est celui de base crée avec un projet android (avec @override, toossa), où une fonction de la classe ci-dessus est appellée.

Je rappel que l'application fonctionne parfaitement bien sous un projet Java... (j'utilise bien l'API requis pour les packages importés, et j'ai bien autorisé l’accès à internet dans le manifest).

Le message d'erreur au lancement de l'application sous l'émulateur Android est "The application has stopped unexpectedly. Please try again"

Merci d'avance ! :D

Vraiment personne ? :(

J'ai réussi à lancer l'application, mais ça m'affiche "Hello World, 'nom de mon appli' !"

Edit : Je progresse petit à petit, mais je bloque sur mon code. Si quelqu'un peut m'aider en PM ça serait gentil...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Il faut passer plus de temps dans le DDMS (80% quoi). L'onglet LogCat dans DDMS t'affiche toutes les erreurs et messages. En filtrant niveau "E" error, tu trouves direct la cause du crash.

A mon avis tu dois avoir un soucis avec les packages. C'est l'une des différences entre C++ et Java (les librairies en C/C++ n'ont rien à voir avec les packages Java). Donc je te conseille de mettre les classes dans le package créé par Android. L'emulateur reconnaît ton point d'entrée par son nom de package.

Alternative, si tu as pris ta classe RSS d'un autre projet, met ce projet en Librarie (Properties->Java Build Path->Add Librairies->Add External Jars). Ensuite fait des

import [packageRSS].[classeRSS]

dans ton Activity lorsque tu veux utiliser ces classes.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Il faut passer plus de temps dans le DDMS (80% quoi). L'onglet LogCat dans DDMS t'affiche toutes les erreurs et messages. En filtrant niveau "E" error, tu trouves direct la cause du crash.

A mon avis tu dois avoir un soucis avec les packages. C'est l'une des différences entre C++ et Java (les librairies en C/C++ n'ont rien à voir avec les packages Java). Donc je te conseille de mettre les classes dans le package créé par Android. L'emulateur reconnaît ton point d'entrée par son nom de package.

Alternative, si tu as pris ta classe RSS d'un autre projet, met ce projet en Librarie (Properties->Java Build Path->Add Librairies->Add External Jars). Ensuite fait des

import [packageRSS].[classeRSS]

dans ton Activity lorsque tu veux utiliser ces classes.

Et comment accède-t-on à ce fameux ddms s'il te plait ? (:

Lien vers le commentaire
Partager sur d’autres sites

Bon j'abandonne, je comprends vraiment pas.

Voici le code que j'ai trouvé sur un site :

import java.io.IOException;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
* Parser un flux RSS
* @author Fobec 2010
*/

public class RSSReader {

   /**
    * Parser le fichier XML
    * @param feedurl URL du flux RSS
    */
   public void parse(String feedurl) {
       try {
           DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
           URL url = new URL(feedurl);
           Document doc = builder.parse(url.openStream());
           NodeList nodes = null;
           Element element = null;
           /**
            * Titre et date du flux
            */
           nodes = doc.getElementsByTagName("title");
           Node node = doc.getDocumentElement();
           System.out.println("Flux RSS: " + this.readNode(node, "channel|title"));
           System.out.println("Date de publication: " + GMTDateToFrench(this.readNode(node, "channel|lastBuildDate")));
           System.out.println();
           /**
            * Elements du flux RSS
            **/
           nodes = doc.getElementsByTagName("item");
           for (int i = 0; i < nodes.getLength(); i++) {
               element = (Element) nodes.item(i);
               System.out.println("Titre: " + readNode(element, "title"));
               System.out.println("Lien: " + readNode(element, "link"));
               System.out.println("Date: " + GMTDateToFrench(readNode(element, "pubDate")));
               System.out.println("Description: " + readNode(element, "description"));
               System.out.println();
           } //for
           //for
       } catch (SAXException ex) {
           Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
       } catch (IOException ex) {
           Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
       } catch (ParserConfigurationException ex) {
           Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
       }
   }

   /**
    * Méthode permettant de retourner ce que contient d'un noeud
    * @param _node le noeud principal
    * @param _path suite des noms des noeud sans espace séparer par des "|"
    * @return un string contenant le valeur du noeud voulut
    */
   public String readNode(Node _node, String _path) {

       String[] paths = _path.split("\\|");
       Node node = null;

       if (paths != null && paths.length > 0) {
           node = _node;

           for (int i = 0; i < paths.length; i++) {
               node = getChildByName(node, paths[i].trim());
           }
       }

       if (node != null) {
           return node.getTextContent();
       } else {
           return "";
       }
   }

   /**
    * renvoye le nom d'un noeud fils a partir de son nom
    * @param _node noeud pricipal
    * @param _name nom du noeud fils
    * @return le noeud fils
    */
   public Node getChildByName(Node _node, String _name) {
       if (_node == null) {
           return null;
       }
       NodeList listChild = _node.getChildNodes();

       if (listChild != null) {
           for (int i = 0; i < listChild.getLength(); i++) {
               Node child = listChild.item(i);
               if (child != null) {
                   if ((child.getNodeName() != null && (_name.equals(child.getNodeName()))) || (child.getLocalName() != null && (_name.equals(child.getLocalName())))) {
                       return child;
                   }
               }
           }
       }
       return null;
   }

   /**
    * Afficher une Date GML au format francais
    * @param gmtDate
    * @return
    */
   public String GMTDateToFrench(String gmtDate) {
       try {
           SimpleDateFormat dfGMT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
           dfGMT.parse(gmtDate);
           SimpleDateFormat dfFrench = new SimpleDateFormat("EEEE, d MMMM yyyy HH:mm:ss", Locale.FRANCE);
           return dfFrench.format(dfGMT.getCalendar().getTime());
       } catch (ParseException ex) {
           Logger.getLogger(RSSReader.class.getName()).log(Level.SEVERE, null, ex);
       }
       return "";
   }

   /**
    * Exemple
    * @param args
    */
   public static void main(String[] args) {
       RSSReader reader = new RSSReader();
       reader.parse("http://www.teamliquid.net/rss/news.xml");
   }
}

Ce code marche donc parfaitement bien en Java, mais pas moyen d'afficher la même page sous android.

J'ai beau manipuler avec du textView, changer les bibliothèques, je n'y arrive pas. Pourtant c'est pas compliqué, c'est juste quelques lignes...

Si quelqu'un pouvait me donner juste ce bout de code qui se lancerais sur android, avec les explications de ce qui va pas, ça serait vraiment sympa !

Lien vers le commentaire
Partager sur d’autres sites

Pour moi, tu dois commencer pas à pas ...

Par de ton code Android qui compile et fonctionne sur mobile en affichant "hello world" est construit au dessus au lieu de partir d'un code java ...

Au final, en partant de ton code, essayes de remplir ton textview avec autrechose que "hello world" en prenant juste certains bouts de ta classe RSS.

Lien vers le commentaire
Partager sur d’autres sites

Pour moi, tu dois commencer pas à pas ...

Par de ton code Android qui compile et fonctionne sur mobile en affichant "hello world" est construit au dessus au lieu de partir d'un code java ...

Au final, en partant de ton code, essayes de remplir ton textview avec autrechose que "hello world" en prenant juste certains bouts de ta classe RSS.

Le truc c'est que j'arrive à faire un Hello World android, avec des bouts de programmes dedans, mais une fois qu'il faut ajouter des textview, les modifier, je capte plus grand chose..

Lien vers le commentaire
Partager sur d’autres sites

Le truc c'est que j'arrive à faire un Hello World android, avec des bouts de programmes dedans, mais une fois qu'il faut ajouter des textview, les modifier, je capte plus grand chose..

Les étapes sont les suivantes :

1) Crée un nouveau projet android

2) Copie colle ce code

package org.fobec;

// import conserve les imports par defaut
import android.text.method.ScrollingMovementMethod;
import android.widget.TextView;

public class ShowRss extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       TextView tvShowRss =  (TextView) findViewById(R.id.tvRss);  
       tvShowRss.setText(parse("http://www.teamliquid.net/rss/news.xml"));
       tvShowRss.setMovementMethod(new ScrollingMovementMethod());

   }


   public String parse(String feedurl) {
   	StringBuilder sb = new StringBuilder();
       try {        	
           DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
           URL url = new URL(feedurl);
           Document doc = builder.parse(url.openStream());
           NodeList nodes = null;
           Element element = null;
           /**
            * Titre et date du flux
            */
           nodes = doc.getElementsByTagName("title");
           Node node = doc.getDocumentElement();
           sb.append("Flux RSS: " + this.readNode(node, "channel|title"));
           sb.append("\n");
           sb.append("Date de publication: " + GMTDateToFrench(this.readNode(node, "channel|lastBuildDate")));
           sb.append("\n");
           /**
            * Elements du flux RSS
            **/
           nodes = doc.getElementsByTagName("item");
           for (int i = 0; i < nodes.getLength(); i++) {
               element = (Element) nodes.item(i);
               sb.append("Titre: " + readNode(element, "title"));
               sb.append("\n");
               sb.append("Lien: " + readNode(element, "link"));
               sb.append("\n");
               sb.append("Date: " + GMTDateToFrench(readNode(element, "pubDate")));
               sb.append("\n");
               sb.append("Description: " + readNode(element, "description"));
               sb.append("\n------------------------\n");               
           } //for
           //for
       } catch (SAXException ex) {
           Logger.getLogger(ShowRss.class.getName()).log(Level.SEVERE, null, ex);
       } catch (IOException ex) {
           Logger.getLogger(ShowRss.class.getName()).log(Level.SEVERE, null, ex);
       } catch (ParserConfigurationException ex) {
           Logger.getLogger(ShowRss.class.getName()).log(Level.SEVERE, null, ex);
       }
       return sb.toString();
   }
// public String readNode(Node _node, String _path) conserve ton code
//public Node getChildByName(Node _node, String _name) conserve ton code
//public String GMTDateToFrench(String gmtDate) conserve ton code
}

3) Modifie le androidanifest.xml pour ajouter le droit d’accéderà internet : <uses-permission android:name="android.permission.INTERNET"/>

4) Modifie le layout par defaut :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
<TextView  
   android:id="@+id/tvRss"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:text="@string/hello"
   android:maxLines="30" android:scrollbars="vertical"/>
</LinearLayout>

Et voilà tu devrais obtenir ceci :

andrssreader.png

Uploaded with ImageShack.us

Voilà en espérant que cela t'aide à "capter" :lol:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...