Salut,
Je dévelloppe une gateway GSM pour l'envoie et la reception de SMS en utilisant un simulateur Toolkit wireless la compilation se fait avec succée mais a l'éxécution il m'affiche les message suivants:
Unable to create MIDlet EnvoiSMS
javax.microedition.global.ResourceException: Not found metafile for base name "res"
at com.sun.j2me.global.AppResourceManagerFactory.getMetafileForBaseName(+115)
at com.sun.j2me.global.AppResourceManagerFactory.getManager(+5)
at com.sun.j2me.global.AppResourceManagerFactory.getManager(+48)
at com.sun.j2me.global.ResourceManagerImpl.getManager(+96)
at com.sun.j2me.global.ResourceManagerImpl.getManager(+26)
at javax.microedition.global.ResourceManager.getManager(+4)
at EnvoiSMS.<init>(+10)
at java.lang.Class.runCustomCode(+0)
at com.sun.midp.midlet.MIDletState.createMIDlet(+34)
at com.sun.midp.midlet.Selector.run(+22)
si vous pouvez m'aider voila mon code
import javax.microedition.global.ResourceManager;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import java.io.*;
/**
*@author Carabuck
*@version 1.0<br><br>
* Cette classe, appelée par la MIDlet EnvoiSMS, se contente de permettre la saisie du message<br>
* et d'envoyer le SMS complet par une connexion basée sur le port 50000.
*/
public class ControleurSMS implements CommandListener, Runnable {
ResourceManager res = ResourceManager.getManager("res");
String Envoyer = new String(res.getString(5));
String Retour = new String(res.getString(6));
String EntrerMsg = new String(res.getString(7));
String Msgcorrect = new String(res.getString(8));
String Enseignant = new String(res.getString(28));
String Cours = new String(res.getString(29));
String Salle = new String(res.getString(30));
String Heureres = new String(res.getString(31));
String Message = new String(res.getString(32));
Command CommandEnvoyer = new Command(Envoyer, Command.OK, 1);
Command CommandRetour = new Command(Retour, Command.BACK, 2);
Display Affichage;
String PortSMS;
String NumeroDestination;
Displayable EcranRetour;
Displayable EcranEnvoi;
Form FenetreInfos;
TextField NomEnseignant;
TextField NomCours;
TextField NomSalle;
TextField Heure;
TextField Msg;
/**
*@param PortSMS Port utilisé par l'application (50000)
*@param Affichage Interface visuelle utilisée
*@param EcranRetour Fenêtre affichée lors du choix "Retour"
*@param EcranEnvoi Fenêtre affichée lors du choix "Envoyer"
*/
public ControleurSMS(String PortSMS, Display Affichage,
Displayable EcranRetour, Displayable EcranEnvoi) {
this.PortSMS = PortSMS;
this.Affichage = Affichage;
this.NumeroDestination = null;
this.EcranRetour = EcranRetour;
this.EcranEnvoi = EcranEnvoi;
FenetreInfos = new Form("Message");
NomEnseignant = new TextField(Enseignant, "", 50, 0);
NomCours = new TextField("Nom du cours", "", 50, 0);
NomSalle = new TextField(Salle, "", 50, 0);
Heure = new TextField(Heureres, "", 50, 0);
Msg = new TextField(Message, "", 50, 0);
FenetreInfos.append(NomEnseignant);
FenetreInfos.append(NomCours);
FenetreInfos.append(NomSalle);
FenetreInfos.append(Heure);
FenetreInfos.append(Msg);
FenetreInfos.addCommand(CommandRetour); //Exemple d'ajout d'une commande pour la navigation
FenetreInfos.addCommand(CommandEnvoyer);
FenetreInfos.setCommandListener(this);
}
/**
* Méthode qui récupère le numéro de téléphone passé en paramètre dans EnvoiSMS et qui appelle la fenêtre de saisie du message.
*@param NumeroDestination Numéro de téléphone passé en paramètre lors de la saisie par l'utilisateur
*/
public void ConfirmeretEnvoyer(String NumeroDestination) //On récupère le numéro de téléphone saisi dans EnvoiSMS pour passer à la saisie du message
{
this.NumeroDestination = NumeroDestination;
Affichage.setCurrent(FenetreInfos);
}
/**
* Méthode permettant de définir les évènements à produire selon la commande choisie par l'utilisateur.
*@param commande Commande choisie par l'utilisateur: "Retour" ou "Envoyer"
*@param affichage Interface visuelle actuelle
*@throws ExceptionCommande Au cas où une erreur surviendrait durant l'exécution d'une commande
*/
public void commandAction(Command commande, Displayable affichage) { //commandAction permet de définir les évènements liées aux actions que choisit l'utilisateur
try {
if (commande == CommandRetour) {
Affichage.setCurrent(EcranRetour);
} else if (commande == CommandEnvoyer) {
Affichage.setCurrent(EcranEnvoi);
new Thread(this).start();
}
} catch (Exception ExceptionCommande) {
ExceptionCommande.printStackTrace();
}
}
/**
* Méthode servant à stopper l'application.
*@param booleen Cette variable prend true ou false comme valeur afin de déterminer si l'on détruit l'application ou non
*/
public void destroyApp(boolean booleen) {
}
/**
* Méthode d'éxecution principale de la classe contenant les instructions d'envoi du SMS via un SocketConnection.
*@throws ExceptionSMS Au cas où une erreur surviendrait durant l'envoi du SMS vers le serveur Web
*/
public void run() {
String NE = "(1)"+NomEnseignant.getString();
String NC = "(2)"+NomCours.getString();
String NS = "(3)"+NomSalle.getString();
String H = "(4)"+Heure.getString();
String M = "(5)"+Msg.getString()+"/";
String ligne = " ";
Alert ConfirmationMessage = new Alert("Confirmation", Msgcorrect + NumeroDestination, null, AlertType.INFO); //Message pour confirmer le bon envoi du SMS
ConfirmationMessage.setTimeout(50000);
try {
SocketConnection socketconnection = (SocketConnection)
Connector.open("socket://localhost:" + PortSMS); //Ouverture du port 50000 associée au localhost(serveur)
OutputStream FluxSortie = null; //Création d'un flux de sortie pour les données
FluxSortie = socketconnection.openOutputStream(); //On rattache la connexion sur le port 50000 au flux de sortie
byte[] donnees1 = NumeroDestination.getBytes(); //L'envoi de données étant plus simple à gérer avec des bytes,
byte[] donnees2 = ligne.getBytes(); //on convertit les données:le numéro du destinataire et le message vers ce format
byte[] donnees3 = NE.getBytes();
byte[] donnees4 = NC.getBytes();
byte[] donnees5 = NS.getBytes();
byte[] donnees6 = H.getBytes();
byte[] donnees7 = M.getBytes();
FluxSortie.write(donnees1); //Ecriture des données bytes sur le flux de sortie
FluxSortie.write(donnees2);
FluxSortie.write(donnees3);
FluxSortie.write(donnees2);
FluxSortie.write(donnees4);
FluxSortie.write(donnees2);
FluxSortie.write(donnees5);
FluxSortie.write(donnees2);
FluxSortie.write(donnees6);
FluxSortie.write(donnees2);
FluxSortie.write(donnees7);
FluxSortie.close();
socketconnection.close();
}
catch (Exception ExceptionSMS){
ExceptionSMS.printStackTrace();
}
Affichage.setCurrent(ConfirmationMessage);
}
}
//et
import javax.microedition.global.ResourceManager;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.util.*;
import java.io.*;
import java.lang.Class.*;
import javax.wireless.messaging.*;
/**
* Cette MIDlet permet l'envoi d'un SMS avec un numéro de téléphone saisi manuellement.<br><br>
* Elle nous permet de récupérer le numéro de l'application qui sera utilisé pour l'envoi du SMS et<br>
* crée une interface de saisie du numéro. Cette MIDlet complètera la suite de la rédaction du message<br>
* en instanciant la classe ControleurSMS.
*@see ControleurSMS#ControleurSMS(String, Display, Displayable, Displayable)
*/
public class EnvoiSMS extends MIDlet implements CommandListener {
ResourceManager res = ResourceManager.getManager("res");
String Quitter = new String(res.getString(1));
String NumTel = new String(res.getString(2));
String MsgInvalide = new String(res.getString(3));
String MsgEnvoi = new String(res.getString(4));
Command CommandeSortie = new Command(Quitter, Command.EXIT, 2);
Command CommandeOK = new Command("OK", Command.OK, 1); //Exemple d'une commande permettant de naviguer au seind de la MIDlet
Display Affichage;
String PortSMS;
TextBox FenetreNumeroDestination;
Alert AlerteMessageErreur;
Alert AlerteMessageEnvoi;
ControleurSMS Controleur;
Displayable EcranResume = null;
public EnvoiSMS() {
PortSMS = getAppProperty("SMS-Port"); //Récupération de la valeur contenue dans le paramètre "SMS-Port" du Wireless ToolKit
Affichage = Display.getDisplay(this); //On initialise l'interface Affichage du téléphone
FenetreNumeroDestination = new TextBox(NumTel, null, 256, TextField.PHONENUMBER); //On crée une nouvelle fenêtre servant à saisir le numéro du destinataire
FenetreNumeroDestination.addCommand(CommandeSortie); //Exemple d'ajout de commandes de navigation
FenetreNumeroDestination.addCommand(CommandeOK);
FenetreNumeroDestination.setCommandListener(this); //Ecoute de la commande sélectionnée
AlerteMessageErreur = new Alert("SMS", null, null, AlertType.ERROR);
AlerteMessageErreur.setTimeout(5000);
AlerteMessageEnvoi = new Alert("SMS", null, null, AlertType.INFO);
AlerteMessageEnvoi.setTimeout(5000);
AlerteMessageEnvoi.setCommandListener(this);
Controleur = new ControleurSMS(PortSMS, Affichage, FenetreNumeroDestination, AlerteMessageEnvoi);
EcranResume = FenetreNumeroDestination;
}
/**
* Méthode servant à initialiser une MIDlet.
*/
public void startApp() {
Affichage.setCurrent(EcranResume);
}
/**
* Méthode servant à interrompre une MIDlet.
*/
public void pauseApp() {
EcranResume = Affichage.getCurrent();
}
/**
* Méthode servant à stopper l'application.
*@param booleen Cette variable prend true ou false comme valeur afin de déterminer si l'on détruit l'application ou non
*/
public void destroyApp(boolean booleen) {
}
/**
* Méthode permettant de définir les évènements à produire selon la commande choisie par l'utilisateur
*@param commande Commande choisie par l'utilisateur: "Quitter" ou "OK
*@param affichage Interface visuelle actuelle
*@see EnvoiSMS#destroyApp(boolean)
*@see EnvoiSMS#notifyDestroyed()
*@see EnvoiSMS#ConfirmeretEnvoyer()
*@throws ExceptionCommande Au cas où une erreur surviendrait durant l'exécution d'une commande
*/
public void commandAction(Command commande, Displayable affichage) { //commandAction permet de définir les évènements liées aux actions que choisit l'utilisateur
try {
if (commande == CommandeSortie) {
destroyApp(false);
notifyDestroyed();
} else if (commande == CommandeOK) {
ConfirmeretEnvoyer();
}
} catch (Exception ExceptionCommande) {
ExceptionCommande.printStackTrace();
}
}
/**
* Méthode qui teste que le numéro de téléphone soit non-vide et, qui appelle la méthode de la classe<br>
* ControleurSMS pour saisir le message et l'envoyer
*@see EnvoiSMS#NumeroEstValide(String)
*@see ControleurSMS#ConfirmeretEnvoyer(String)
*/
public void ConfirmeretEnvoyer() {
String NumeroDestination = FenetreNumeroDestination.getString(); //On récupère le numéro de téléphone sous forme de chaine de caractères
if (!EnvoiSMS.NumeroEstValide(NumeroDestination)) { //Test d'un numéro de téléphone non vide
AlerteMessageErreur.setString(MsgInvalide);
Affichage.setCurrent(AlerteMessageErreur, FenetreNumeroDestination);
return;
}
String statusMessage = MsgEnvoi + NumeroDestination + "...";
AlerteMessageEnvoi.setString(statusMessage);
Controleur.ConfirmeretEnvoyer(NumeroDestination);// Si le numéro est valide, on instancie un nouvel objet de classe ControleurSMS
} // nous permettant de passer à la saisie du message et son envoi vers la Servlet
/**
* Méthode servant à tester un numéro de téléphone
*@param number Numéro de téléphone saisi par l'utilisateur
*@return Retourne un booléen "true" si le numéro est valide et "false" s'il ne l'est pas
*/
public static boolean NumeroEstValide(String number) {
char[] characteres = number.toCharArray();
if (characteres.length == 0) {
return false;
}
int startPos = 0;
if (characteres[0] == '+') {
startPos = 1;
}
for (int i = startPos; i < characteres.length; ++i) {
if (!Character.isDigit(characteres[i])) {
return false;
}
}
return true;
}
}