[ZT]使用WMA发送手机短信的详细说明

使用WMA发送手机短信的详细说明zz
2007-01-17 14:51
12-29 使用WMA发送手机短信的详细说明
本文详细介绍如何使用WMA使J2ME程序实现发送手机短信功能。


使用WMA可以在J2ME程序非常容易的实现发送手机短信功能。网上有许多类似的文章介绍过,但没有给出实例,使不少没有相关经验的开发人员走了不少弯路才实现这么一个简单的功能。我将结合自己的经历总结一下,帮助朋友们少走弯路。

下面的代码取自WMA2.0的说明文档。

try {

String addr="sms://+358401234567";
MessageConnection conn=(MessageConnection)Connector.open(addr);
TextMessage msg=(TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);
msg.setPayloadText("Hello World!");
conn.send(msg);
} catch (Exception e) {
...
}

我把上面的代码略微修改一下,放入到函数中,但是我在调用时,总是出现异常导致发送失败。开始以为代码抄错了,反复比较也没发现问题。后来又上网查找,找 到的都是与上面代码类似的代码,问题依然存在。后来想了一下,求人不如求己。于是我跟踪了一下程序,发现是在执行conn.send(msg);这行代码 时出现异常。异常类名为java.lang.RuntimeException,错误信息为Blocking call performed in the event thread.意思是说在线程事件中禁止当前调用的执行。

通过查找资料发现原来WMA是基于Generic Connection Framework(以后简称GCF)的,GCF是被定义在CLDC1.0说明中的。GCF是J2ME对外界沟通的基础,举凡网络通讯、消息服务、蓝牙、 文件系统、端口或是SIM卡的存取,都以GCF为基础发展而来。 我又阅读了几个在GCF下使用HTTP协议,Socket协议等的例子,我发现一个共同的特点,都需要使用独立的线程。我猜想发送短信失败的异常一定是由 于我没有将上面的代码写入到独立线程导致的。马上修改上面的代码写成一个独立的线程调试,这回发送成功了。

SMSMessage.java的文件内容如下:

/*
* SMSMessage.java
*
* Created on 2006年12月27日, 上午2:48 by whb
*
*/

import javax.microedition.io.Connector;
import javax.microedition.lcdui.*;
import javax.wireless.messaging.MessageConnection;
import javax.wireless.messaging.TextMessage;


public class SMSMessage extends Thread{
private String address="";
private String content="";
private String errorText=""; //失败时的原因
private Display dis=null;


/** Creates a new instance of SMSMessage */
public SMSMessage(String smsaddress,String smscontent,Display ldis) {
address=smsaddress;
content=smscontent;
dis=ldis;
}


public void run(){
MessageConnection conn=null;
try {
String desaddress="sms://"+address;
conn=(MessageConnection)Connector.open(desaddress);
TextMessage msg=(TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);
msg.setPayloadText(content);
conn.send(msg);
Alert sucessalert=new Alert("提示");
sucessalert.setString("成功发送到:"+address);
sucessalert.setType(AlertType.ALARM);
dis.setCurrent(sucessalert);
return;
}
catch(Exception e) {
errorText=e.getMessage();
Alert failalert=new Alert("提示");
failalert.setString("发送失败!原因:"+errorText);
failalert.setType(AlertType.WARNING);
dis.setCurrent(failalert);
return;
}
finally {
try
{
if (conn!=null) {conn.close();}
}
catch (Exception e) {
}
}
}
}


调用代码如下:
String lsSMSAddress="+86130XXXXXXXX";
String lsSMSContent="欢迎大家使用第一天软件工作室开发的软件!"
SMSMessage sms=new SMSMessage(lsSMSAddress,lsSMSContent,Display.getDisplay(this));
sms.start();

在手机上调试时,可能会出现类似的许可询问“正在请求许可发送文字信息,可能收取费用。1.信息发送至+86130XXXXXXXX.同意许可?”,选择'是'就可以成功的发送短信了。

看过之后,是不是发现代码如此简单呀。

如果还想继续开发更复杂一些的应用程序,建议朋友们仔细阅读一下WMA2.0的说明文档,也就是JSR 205.说明文档中详细介绍了GSM SMS Adapter,GSM Cell Broadcast Adapter,CDMA IS-637 SMS Adapter ,MMS Adapter等的使用方法。文档中也详细的介绍了javax.wireless.messaging包中的BinaryMessage, Message,MessageConnection,
MessageListener,MessagePart,MultipartMessage, SizeExceededException,TextMessage。


转自 http://hi.baidu.com/quijote/blog/item/cdf79c102b5ca001213f2e80.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值