Делаем проект на Java2ME для отправки SMS на список номеров
Собственно, непроверенный остаток ныне ненужного кода.
Идея была простой - пользователь выбирает из списка нужный пункт (например, описание игры), приложение отправляет SMS указанного содержимого (например, цифровой код) на этот номер.
Опции проекта: MIDP2.0/CLDC1.0, подключнный Wireless Messaging API 1.1 (пакет JSR 120) и Mobile Media API (JSR 135). Компиливалось в WTK2.2
Класс midlet.java - отвечает за вывод главной формы и главного меню
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class midlet extends MIDlet implements CommandListener { private boolean isStarted = false; Form main; public Command Start,Exit; public midlet() { Start = new Command("Старт", Command.OK, 0); Exit = new Command("Выход", Command.EXIT, 0); main = new Form ("Демо"); //Здесь можно еще чего-нибудь добавить на главную форму main.addCommand (Start); main.addCommand (Exit); main.setCommandListener (this); } protected void destroyApp(boolean unconditional) {} protected void pauseApp() {} protected void startApp() { if (isStarted) { return; } Display.getDisplay(this).setCurrent (main); isStarted = true; } public void quit () { System.gc(); destroyApp(true); notifyDestroyed(); } public void commandAction (Command c, Displayable d) { if (c==Start) { new SMSSend(this,main); } else { quit (); } } }
Класс Sender.java - отправка сообщения в новом потоке
//Требует включенной в среде опции "Wireless Messaging API (JSR120)" import javax.microedition.io.*; import javax.microedition.lcdui.*; import javax.wireless.messaging.*; import java.io.IOException; public class Sender implements CommandListener, Runnable { Command sendCommand = new Command("Послать", Command.OK, 1); Command backCommand = new Command("Назад", Command.BACK, 2); Display display; String smsPort; String destinationAddress; TextBox messageBox; Displayable backScreen,sendingScreen; String Log; public Sender (String smsPort, Display display, Displayable backScreen, Displayable sendingScreen, String hdr, String msg) { //Конструктор класса отправки SMS this.smsPort = smsPort; this.display = display; this.destinationAddress = null; this.backScreen = backScreen; this.sendingScreen = sendingScreen; messageBox = new TextBox(hdr, msg, 256, TextField.UNEDITABLE); messageBox.addCommand(backCommand); messageBox.addCommand(sendCommand); messageBox.setCommandListener(this); } public void promptAndSend (String destinationAddress) { //Показать бокс сообщения this.destinationAddress = destinationAddress; display.setCurrent(messageBox); } public void commandAction(Command c, Displayable s) { //Реакция на кнопки try { if (c == backCommand) { display.setCurrent(backScreen); } else if (c == sendCommand) { display.setCurrent (sendingScreen); messageBox.removeCommand(sendCommand); Log=""; new Thread(this).start(); } } catch (Exception ex) { //ex.printStackTrace(); Log+="Открытие:\n"+ex.getMessage()+'\n'; } } public void run() { //Работа с потоком отправки сообщения String address = destinationAddress + ":" + smsPort; MessageConnection smsconn = null; try { smsconn = (MessageConnection)Connector.open(address); TextMessage txtmessage = (TextMessage)smsconn.newMessage(MessageConnection.TEXT_MESSAGE); txtmessage.setAddress(address); txtmessage.setPayloadText(messageBox.getString()); smsconn.send(txtmessage); } catch (Throwable t) { //System.out.println("Send caught: "); //t.printStackTrace(); Log+="Отправка:\n"+t.getMessage()+'\n'; } if (smsconn != null) { try { smsconn.close(); } catch (IOException ioe) { //System.out.println("Closing connection caught: "); //ioe.printStackTrace(); Log+="Завершение:\n"+ioe.getMessage()+'\n'; } } } }
Класс ShowBox.java - простой показ текстового бокса с сообщением
import javax.microedition.lcdui.*; public class ShowBox extends TextBox implements CommandListener { midlet midlet; Displayable parent; Command cmdBack; public ShowBox (midlet midlet, Displayable parent, String hdr) { super (hdr,"",256,TextField.UNEDITABLE); this.midlet = midlet; this.parent = parent; cmdBack = new Command("Назад", Command.BACK, 1); addCommand (cmdBack); } public void show (String s) { setString (s); Display.getDisplay(midlet).setCurrent (this); setCommandListener (this); } public void commandAction (Command c, Displayable d) { Display.getDisplay(midlet).setCurrent(parent); } }
Класс SMSSend.java - выводит список игр, выбирает из него, вызывает Sender для отправки
import javax.microedition.midlet.*; import javax.microedition.io.*; import javax.microedition.lcdui.*; import javax.wireless.messaging.*; import java.io.IOException; public class SMSSend implements CommandListener { List main; Image img=null; Command exitCommand = new Command("Выход", Command.EXIT, 2); Display display; String smsPort; Sender sender; Displayable resumeScreen = null; TextBox destinationAddressBox; midlet midlet; Displayable parent; private static final int SMScount = 3; //Количество строк в SMSinfo! private static String [][] SMSinfo = { //Название игры (пункта меню), текст описания, номер телефона, содержимое сообщения { "Игра 1","Описание\nигры 1","+79139393418","1234" }, { "Игра 2","Описание\nигры 2","+15550000","2" }, { "Игра 3","Описание\nигры 3","+15550000","3" } }; public SMSSend (midlet midlet, Displayable parent) { //Конструктор this.midlet=midlet; this.parent = parent; display = Display.getDisplay(midlet); smsPort = midlet.getAppProperty("SMS-Port"); try { img=Image.createImage("/icon.png"); } catch (java.io.IOException e) { //new ShowBox (midlet, parent, "Ошибка").show (e.getMessage()); //return; } main = new List ("SMSBox!", List.IMPLICIT); int i; for (i=0; i<SMScount; i++) { main.append (SMSinfo[i][0],img); } main.addCommand (exitCommand); main.setCommandListener(this); Display.getDisplay(midlet).setCurrent (main); } private static boolean isValidPhoneNumber(String number) { //Проверка корректности number: возможно, лидирующий "+", затем цифры char[] chars = number.toCharArray(); if (chars.length == 0) return false; int startPos = 0; if (chars[0]=='+') startPos = 1; for (int i = startPos; i < chars.length; ++i) { if (!Character.isDigit(chars[i])) return false; } return true; } private void promptAndSend (int selector) { //Показать сообщение перед отправкой String address = SMSinfo[selector][2]; if (!SMSSend.isValidPhoneNumber(address)) { new ShowBox (midlet, parent, "Ошибка").show ("Неверный номер телефона "+selector); return; } Alert sendAlert = new Alert("Отправка SMS", SMSinfo[selector][2], null, AlertType.INFO); sendAlert.setTimeout(5000); sender = new Sender (smsPort, display, main, sendAlert, SMSinfo[selector][2], SMSinfo[selector][1]); sender.promptAndSend("sms://" + address); } public void commandAction(Command c, Displayable s) { try { if (c==exitCommand || c==Alert.DISMISS_COMMAND) { Display.getDisplay(midlet).setCurrent (parent); } else if (c==List.SELECT_COMMAND) { promptAndSend(main.getSelectedIndex()); } } catch (Exception ex) { new ShowBox (midlet, parent, "Ошибка").show (ex.getMessage()); return; } } }
Скачать и ссылки
Архив ZIP с демо-мидлетом SMSBox (не проверен) (5 Кб)
Исходники проекта для среды WTK 2.2 (5 Кб)
Скачать WTK 2.2, прочитать о начале работы с мобильной явой в моей статье
27.01.2009, 16:35 [14460 просмотров]