L'invio e la ricezione di SMS da applicazioni J2ME sono consentiti tramite le Wireless Messaging API (WMA), package opzionale che attualmente è presente in gran parte dei modelli di terminali presenti sul mercato.
Attualmente le WMA sono alla versione 1.1 (JSR 120), mentre sono in fase di approvazione le WMA versione 2.0 (identificata dalla JSR 205).
Le WMA 1.1 sono supportate nativamente nel WTK, mentre se si vogliono affrontare progetti provando le WMA 2.0, è necessario selezionare l'apposita checkbox nella schermata "Settings for Project" del WTK.
Inviare SMS
Come nel caso di una normale connessione di rete, anche per inviare un messaggio è necessario aprire una connessione (sul modello del Generic Connection Framework GCF) e creare, in questo caso, una MessageConnection
:
MessageConnection msgConnection = (MessageConnection) Connector.open("sms://3481234567");
In questo modo abbiamo creato una connessione per inviare un SMS al numero 3481234567.
È opportuno gestire l'invio dell'SMS in un thread separato:
...//
SMSSender sender = new SMSSender();
Thread th = new Thread(sender);
th.start();
...//
Listato 32. invio sms (Vedi codice completo)
..//
conn = (MessageConnection) Connector.open("sms://3481234567");
TextMessage msg = (TextMessage) conn.newMessage(
MessageConnection.TEXT_MESSAGE);
msg.setPayloadText("Ciao");
conn.send(msg);
..//
Anche quando si effettua l'invio di un SMS, se la midlet non è autenticata dal produttore del terminale, apparirà una schermata che richiede la confermare dell'operazione.
È possibile stabilire una connessione senza specificare a priori il numero a cui inviare il messaggio, che viene poi settato quando si crea l'oggetto TextMessage (la porta sarà utile quando si dovrà gestire dalla midlet sia l'invio che la ricezione di SMS):
MessageConnection conn = (MessageConnection) Connector.open("sms://");
TextMessage msg = (TextMessage) conn.newMessage(MessageConnection.TEXT_MESSAGE, "3481234567");
msg.setPayloadText("Ciao");
Oltre che messaggi di testo è possibile spedire anche messaggi binari, nei quali viene inviato un contenuto rappresentato da un array di byte:
Listato 33. invio messaggi binari
public void sendBinaryMessage(MessageConnection conn, byte[] content) {
try {
BinaryMessage bmsg = (BinaryMessage)conn.newMessage(MessageConnection.BINARY_MESSAGE);
bmsg.setAddress("sms://34812345678:7500");
bmsg.setPayloadData(msg);
conn.send(bmsg);
}
catch(Exception e) {
e.printStackTrace();
}
}
In questo esempio si è settata la porta di destinazione dell'SMS che è la 7500: è un'altra modalità di configurazione che si ha utilizzando WMA.
Per provare i progetti che utilizzano WMA nel WTK si può utilizzare la WMA console. Per attivarla si va su File>Utilities e si preme il quinto pulsante ("Open console") sulla destra.
La console permette di verificare se il nostro codice per l'invio SMS è corretto. Per fare ciò, la destinazione del nostro SMS deve essere +5550000 (lo possiamo sostituire a 3481234567), cioè il numero riportato in alto a sinistra sulla console.
Effettuando l'invio del messaggio, nella console viene riportata, tramite un opportuno tracciamento, la ricezione del messaggio spedito dall'emulatore del WTK identificato dal numero +5550001.
Ricevere un SMS
Le applicazioni J2ME possono ricevere messaggi su una determinata porta e quindi questa deve essere specificata quando si crea la connessione:
MessageConnection conn = (MessageConnection) Connector.open("sms://:7500");
Ci sono due modi per effettuare la ricezione:
- creare un thread di ricezione;
- estendere l'interfaccia MessageListener per ricevere i messaggi in maniera asincrona.
Nel primo caso si sfrutta il metodo receive()
di MessageConnection
che è bloccante. Alla ricezione, l'esecuzione va avanti e si può determinare il tipo di messaggio (nel codice seguente consideriamo solo i messaggi di testo) e leggerne i dati (mittente, testo, ecc.) tramite i metodi getPayloadText()
e getAddress()
:
Listato 34. Ricezione sms (Vedi codice completo)
..//
mc = (MessageConnection) Connector.open("sms://+7500");
msg = mc.receive();
if (msg instanceof TextMessage)
{
originator = msg.getAddress();
TextMessage tmsg = (TextMessage) msg;
text = tmsg.getPayloadText();
..//
Form form = new Form(originator);
form.append(text);
..//
display.setCurrent(form);
..//