БлогNot. Делаем проект на Java2ME для отправки SMS на список номеров

Делаем проект на 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 [14353 просмотра]


теги: программирование софт мобильник sms java2me

К этой статье пока нет комментариев, Ваш будет первым