Možná, že v nějaké vaší mobilní aplikaci budete potřebovat dát uživateli možnost odeslat SMS zprávu. Zde vám ukážu, jak na to.
K odesílání SMS zprávy budeme potřebovat balík WMA (Wireless Messaging API). Krom něj budeme potřebovat standardní balíky lcdui, midlet a io (vstup/výstup).
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;
Vytvoříme veřejnou třídu a jako extends nastavíme MIDlet a jako implements CommandListener. Upozorňuji, že třída musí mít stejný název jako soubor (v tomto případě sms.java).
public class sms extends MIDlet implements CommandListener{
Nyní je třeba vytvořit proměnné, které budeme potřebovat. K čemu je budeme potřebovat, je napsáno v komentářích:
Display display; //promenna predstavujici display mobilniho telefonu
Form fCislo; //formular
TextBox txtText; //pro text vasi zpravy
TextField txtCislo; //textove pole pro zadaní tel. cisla
MessageConnection conn = null; //promenna k otevreni spojeni
String sCislo; //telefoni cislo prijemce
Command cOdeslat = new Command("Odeslat",Command.OK,1); //tlacitko pro prepnuti obrazovky
Command cOk = new Command("OK",Command.OK,1); //tlacitko pro odeslani SMS zpravy
Command cKonec = new Command("Konec",Command.EXIT,0); //tlacitko pro ukonceni aplikace
Teď přichází na řadu definice proměnných ve funkci sms():
public sms(){
display = Display.getDisplay(this); //definovani promenne display
fCislo = new Form("Cislo"); //vytvoreni Formulare
txtText = new TextBox("Text vaší zptávy","",160,TextField.ANY); //vytvoreni TextBoxu
txtCislo = new TextField("Telefoni cislo:","",13,TextField.PHONENUMBER); //T.P. do ktereho pujde zadavat pouze cisla a +
}
Ve funkci startApp přiřadíme tlačítka formulářům a nastavíme formulář, který se má zobrazit při zapnutí aplikace.
public void startApp(){
txtText.addCommand(cOdeslat); //pridani tlacitka cOdelsat
txtText.addCommand(cKonec);
txtText.setCommandListener(this); //nastavit "poslouchani" tlacitek u txtText
fCislo.append(txtCislo); //pridat textove pole na formular fCislo
fCislo.addCommand(cOk);
fCislo.addCommand(cKonec);
fCislo.setCommandListener(this); //nastavit "poslouchani" tlacitek u formulare fCislo
display.setCurrent(txtText); //zobrazit na displayi txtText
}
A ještě nezbytné funkce:
public void pauseApp(){ } //f-ce pro pauznutí aplikace - povinna
public void destroyApp(boolean b){ } //f-ce pro ukonceni aplikace - povinna
A teď funkce, ve které budou všechny akce po stisknutí jednotlivých tlačítek:
public void commandAction(Command c,Displayable d){
if(c == cOdeslat){ //pokud bylo stisknuto tlacitko cOdeslat
display.setCurrent(fCislo); //nastavit na displayi formular fCislo
}
A teď přichází na řadu to nejdůležitější, pokud bylo stisknuto tlačítko Ok pro odeslání SMS zprávy, přiřadíme proměnné sCislo důležitý prefix sms:// a telefonní číslo příjemce z textového pole. Poté otevřeme spojení, vytvoříme SMS zprávu a vložíme do ní text z TextBoxu a poté již můžeme zprávu odeslat. Nakonec jenom ošetříme některé výjimky a je to.
if(c == cOk){
sCislo = "sms://"+txtCislo.getString(); //prefix sms:// + telefoni cislo prijemce
try{
conn = (MessageConnection) Connector.open(sCislo); //otevreni spojeni
TextMessage zprava = (TextMessage)conn.newMessage(conn.TEXT_MESSAGE); //vytvoreni SMS zpravy
zprava.setPayloadText(txtText.getString()); //pridame do SMS zpravy nas text
conn.send(zprava); //a posleme ji..
}
catch(Exception e){
destroyApp(true); //pri vyjimce ukoncime aplikaci
notifyDestroyed();
} finally {
if(conn != null){
try{
conn.close(); // pokud nebylo spojeni ukonceno, tak jej ukoncime
}
catch(Exception e){
destroyApp(true); //pri vyjimce ukoncime aplikaci
notifyDestroyed();
}
}
}
}
A pokud uživatel zvolil tlačítko Konec, ukončíme aplikaci.
if(c == cKonec){
destroyApp(true); //ukoncime aplikaci
notifyDestroyed();
}
}
Zdrojový kód celé aplikace:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;
public class sms extends MIDlet implements CommandListener{
Display display; //promenna predstavujici display mobilniho telefonu
Form fCislo; //formular
TextBox txtText; //pro text vasi zpravy
TextField txtCislo; //textove pole pro zadaní tel. cisla
MessageConnection conn = null; //promenna k otevreni spojeni
String sCislo;
Command cOdeslat = new Command("Odeslat",Command.OK,1); //tlacitko pro prepnuti obrazovky
Command cOk = new Command("OK",Command.OK,1); //tlacitko pro odeslani SMS zpravy
Command cKonec = new Command("Konec",Command.EXIT,0); //tlacitko pro ukonceni aplikace
public sms(){
display = Display.getDisplay(this); //definovani promenne display
fCislo = new Form("Cislo"); //vytvoreni Formulare
txtText = new TextBox("Text vaší zptávy","",160,TextField.ANY); //vytvoreni TextBoxu
txtCislo = new TextField("Telefoni cislo:","",13,TextField.PHONENUMBER); //T.P. do ktereho pujde zadavat pouze cisla a +
}
public void startApp(){
txtText.addCommand(cOdeslat); //pridani tlacitka cOdelsat
txtText.addCommand(cKonec);
txtText.setCommandListener(this); //nastavit "poslouchani" tlacitek u txtText
fCislo.append(txtCislo); //pridat textove pole na formular fCislo
fCislo.addCommand(cOk);
fCislo.addCommand(cKonec);
fCislo.setCommandListener(this); //nastavit "poslouchani" tlacitek u formulare fCislo
display.setCurrent(txtText); //zobrazit na displayi txtText
}
public void pauseApp(){ } //f-ce pro pauznutí aplikace - povinna
public void destroyApp(boolean b){ } //f-ce pro ukonceni aplikace - povinna
public void commandAction(Command c,Displayable d){
if(c == cOdeslat){ //pokud bylo stisknuto tlacitko cOdeslat
display.setCurrent(fCislo); //nastavit na displayi formular fCislo
}
if(c == cOk){
sCislo = "sms://"+txtCislo.getString(); //prefix sms:// + telefoni cislo prijemce
try{
conn = (MessageConnection) Connector.open(sCislo); //otevreni spojeni
TextMessage zprava = (TextMessage)conn.newMessage(conn.TEXT_MESSAGE); //vytvoreni SMS zpravy
zprava.setPayloadText(txtText.getString()); //pridame do SMS zpravy nas text
conn.send(zprava); //a posleme ji..
}
catch(Exception e){
destroyApp(true); //pri vyjimce ukoncime aplikaci
notifyDestroyed();
} finally {
if(conn != null){
try{
conn.close(); // pokud nebylo spojeni ukonceno, tak jej ukoncime
}
catch(Exception e){
destroyApp(true); //pri vyjimce ukoncime aplikaci
notifyDestroyed();
}
}
}
}
if(c == cKonec){
destroyApp(true); //ukoncime aplikaci
notifyDestroyed();
}
}
}
To je vše. Nakonec jenom dodám, že tato SMS stojí stejně jako normální SMS! Doufám, že se po mně po zveřejnění nebudete dožadovat dobití kreditu :-).