问题描述
一个菜鸟在学习javaME的SMS这块,请高人指点迷津照书上例子COPY下来,sun的模拟器能收发,但在真机上却收不到短信,短息好像能发出,但出去后就石沉大海,不知道问题出在哪里。还有模拟器和真机都不能给本机发短信吗,发了也是收不到。在NokiaE52,N73,6300c,SonyW810上都试过,不行!急,查了老多资料不知道为什么我刚注册进来不多久,没多少分,但请各位高手帮忙,谢谢还有就是其中的Push注册,在真机上到底是怎么出现的?不用开程序,接到短信就自动启动了?下面的代码来自书《javaME核心技术与最佳实践》importjava.io.IOException;importjavax.microedition.io.Connector;importjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;importjavax.wireless.messaging.*;publicclassSMSMIDletextendsMIDletimplementsCommandListener,MessageListener{privateDisplaydisplay=null;//以服务器模式运行的MessageConnectionprivateMessageConnectionreceiveConn=null;privatebooleandone=false;MessageReaderreader=null;privateListlist=null;//主界面privateDisplayableresume=null;privateSendMessageUIsend=null;publicstaticfinalString[]items={"发信息","收件箱"};publicstaticfinalCommandexitCommand=newCommand("退出",Command.EXIT,1);publicstaticfinalCommandbackCommand=newCommand("返回",Command.BACK,2);publicvoidstartApp(){if(display==null){display=Display.getDisplay(this);list=newList("短消息中心",List.IMPLICIT,items,null);resume=list;list.addCommand(exitCommand);list.setCommandListener(this);}initMessageServer();display.setCurrent(resume);}privatevoidinitMessageServer(){//程序启动后,建立服务器模式的MessageConnection,监听短消息done=false;Stringurl="sms://:"+this.getAppProperty("port");System.out.println(url);try{receiveConn=(MessageConnection)Connector.open(url);//设置监听器,异步模式等待短信receiveConn.setMessageListener(this);reader=newMessageReader();newThread(reader).start();}catch(IOExceptionex){this.displayError(ex.toString(),list);}}publicvoidpauseApp(){//保存当前界面resume=display.getCurrent();release();}publicvoiddestroyApp(booleanunconditional){release();}privatevoidrelease(){//释放资源done=true;try{receiveConn.setMessageListener(null);receiveConn.close();receiveConn=null;}catch(IOExceptionex){ex.printStackTrace();}}publicvoidsetCurrent(Displayabledisplayable){display.setCurrent(displayable);}publicvoiddisplayError(Stringmessage,Displayabledisplayable){Alertalert=newAlert("错误提示");alert.setType(AlertType.ERROR);alert.setString(message);alert.setTimeout(2000);display.setCurrent(alert,displayable);}publicvoidbackToMain(){display.setCurrent(list);}publicvoidcommandAction(Commandcmd,Displayabledisplayable){if(cmd==exitCommand){destroyApp(false);notifyDestroyed();}elseif(cmd==List.SELECT_COMMAND){Stringlabel=list.getString(list.getSelectedIndex());if(label.equals(items[0])){if(send==null)send=newSendMessageUI(this);send.clean();display.setCurrent(send);}elseif(label.equals(items[1])){}}elseif(cmd==backCommand){display.setCurrent(list);}}//当消息到来的时候,nitifyIncomingMessage()方法被调用publicvoidnotifyIncomingMessage(MessageConnectionmessconn){if(messconn==receiveConn){reader.handleMessage();}}classMessageReaderimplementsRunnable{privateintpendingMessage=0;publicvoidrun(){while(!done){synchronized(this){//如果没有消息,则线程等待if(pendingMessage==0){try{wait();}catch(InterruptedExceptionex){ex.printStackTrace();}}//读取消息,pendingMessage--pendingMessage--;}//接收短信Messagemessage=null;try{message=receiveConn.receive();}catch(IOExceptionex){//处理异常}if(messageinstanceofTextMessage){TextMessagetm=(TextMessage)message;Stringcontent=tm.getPayloadText();Stringaddress=tm.getAddress();Formform=newForm("接收到短信");form.append(address+"n");form.append(content+"n");form.addCommand(backCommand);form.setCommandListener(SMSMIDlet.this);display.setCurrent(form);}elseif(messageinstanceofBinaryMessage){//这里不考虑BinaryMessage的情况}}}//又短消息进入,唤醒等待的线程读取消息publicsynchronizedvoidhandleMessage(){pendingMessage++;//未读取的消息数增加1notify();}}}importjavax.microedition.io.Connector;importjavax.microedition.lcdui.*;importjavax.wireless.messaging.*;publicclassSendMessageUIextendsFormimplementsCommandListener,Runnable{privateSMSMIDletmidlet=null;privateTextFieldaddress=null;privateTextFieldmessage=null;privateStringnumber="";//收信人号码privateStringcontent="";//短信内容publicstaticfinalCommandsendCommand=newCommand("发送",Command.OK,1);publicstaticfinalCommandbackCommand=newCommand("返回",Command.BACK,2);publicSendMessageUI(SMSMIDletmidlet){super("发送短信");this.midlet=midlet;address=newTextField("收信人","",20,TextField.PHONENUMBER);message=newTextField("短信内容","",140,TextField.ANY);this.append(address);this.append(message);this.addCommand(sendCommand);this.addCommand(backCommand);this.setCommandListener(this);}publicvoidclean(){//清除收信人和短信内容文本框的内容address.setString("");message.setString("");}publicvoidcommandAction(Commandcmd,Displayabledisplayable){if(cmd==backCommand){midlet.backToMain();}elseif(cmd==sendCommand){//启动发送短消息的线程number=address.getString();content=message.getString();newThread(this).start();}}publicvoidrun(){Stringaddress="sms://"+"+"+number+":"+midlet.getAppProperty("port");MessageConnectionmconn=null;try{//建立客户端模式的MessageConnection,读者应该在这里添加一个等待界面mconn=(MessageConnection)Connector.open(address);TextMessagetm=(TextMessage)mconn.newMessage(MessageConnection.TEXT_MESSAGE);//设置消息地址和文本数据tm.setAddress(address);tm.setPayloadText(content);//发送消息mconn.send(tm);mconn.close();midlet.backToMain();}catch(Exceptionex){ex.printStackTrace();midlet.displayError(ex.toString(),this);}}}这个是jad文件port:50000MIDlet-1:SMSMIDlet,,SMSMIDletMIDlet-Jar-URL:SMSMIDlet.jarMicroEdition-Configuration:CLDC-1.1MIDlet-Push-1:sms://:50000,SMSMIDlet,*MIDlet-Version:1.0.0MIDlet-Name:SMSMIDletMidletSuiteMIDlet-Vendor:MidletSuiteVendorMicroEdition-Profile:MIDP-2.0MIDlet-Permissions:javax.microedition.io.PushRegistry,javax.microedition.io.Connector.sms
解决方案
解决方案二:
补:两部对发的手机都安装的这个程序
解决方案三:
引用1楼nilqujianping的回复:
补:两部对发的手机都安装的这个程序
学习
解决方案四:
LZ可以参考这个帖子:
解决方案五:
我看了,他的代码跟我贴的这个没多大差别,还是谢谢你
解决方案六:
抱歉,没做过短信接收和PUSH如果是发送不带端口的短信,手机是能正常接收到的
解决方案七:
引用5楼kf156的回复:
抱歉,没做过短信接收和PUSH如果是发送不带端口的短信,手机是能正常接收到的
哦,好吧,还是非常谢谢你!!!
解决方案八:
带端口的短信要用软件在端口上监听才能收到并且经本人测试在短信发出后运营商会将短信发送给你一次软件开的晚了也是收不到的
解决方案九:
展现消息的语句直接在notifyIncomingMessage方法里起线程做试试
解决方案十:
学习学习
解决方案十一:
该回复于2011-04-11 08:35:58被版主删除
解决方案十二:
支持一下,其实WTK下面关于短信有个demo代码的