Android编程之非调用系统界面实现发送彩信的方法(MMS)
本文实例讲述了Android非调用系统界面实现发送彩信的方法。分享给大家供大家参考,具体如下:
一、问题:
最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样:
不使用StartActivity,像发短信那样,调用一个类似于发短信的方法
SmsManagersmsManager=SmsManager.getDefault(); smsManager.sendTextMessage(phoneCode,null,text,null,null);
二、解决方法:
由于android上根本就没有提供发送彩信的接口,如果你想发送彩信,对不起,请调用系统彩信app界面,如下:
IntentsendIntent=newIntent(Intent.ACTION_SEND,Uri.parse("mms://")); sendIntent.setType("image/jpeg"); Stringurl="file://sdcard//tmpPhoto.jpg"; sendIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse(url)); startActivity(Intent.createChooser(sendIntent,"MMS:"));
但是这种方法往往不能满足我们的需求,能不能不调用系统界面,自己实现发送彩信呢?经过几天的努力,终于找到了解决办法。
第一步:先构造出你要发送的彩信内容,即构建一个pdu,需要用到以下几个类,这些类都是从android源码的MMS应用中mms.pdu包中copy出来的。你需要将pdu包中的所有类
都拷贝到你的工程中,然后自己酌情调通。
finalSendReqsendRequest=newSendReq(); finalPduBodypduBody=newPduBody(); finalPduPartpart=newPduPart(); //存放附件,每个附件是一个part,如果添加多个附件,就想body中add多个part。 pduBody.addPart(partPdu); sendRequest.setBody(pduBody); finalPduComposercomposer=newPduComposer(ctx,sendRequest); finalbyte[]bytesToSend=composer.make(); //将彩信的内容以及主题等信息转化成byte数组,准备通过http协议 //发送到”http://mmsc.monternet.com”;
第二步:发送彩信到彩信中心。
构建pdu的代码:
Stringsubject="测试彩信"; Stringrecipient="接收彩信的号码";//138xxxxxxx finalSendReqsendRequest=newSendReq(); finalEncodedStringValue[]sub=EncodedStringValue.extract(subject); if(sub!=null&&sub.length>0){ sendRequest.setSubject(sub[0]); } finalEncodedStringValue[]phoneNumbers=EncodedStringValue.extract(recipient); if(phoneNumbers!=null&&phoneNumbers.length>0){ sendRequest.addTo(phoneNumbers[0]); } finalPduBodypduBody=newPduBody(); finalPduPartpart=newPduPart(); part.setName("sample".getBytes()); part.setContentType("image/png".getBytes()); Stringfurl="file://mnt/sdcard//1.jpg"; finalPduPartpartPdu=newPduPart(); partPdu.setCharset(CharacterSets.UTF_8);//UTF_16 partPdu.setName(part.getName()); partPdu.setContentType(part.getContentType()); partPdu.setDataUri(Uri.parse(furl)); pduBody.addPart(partPdu); sendRequest.setBody(pduBody); finalPduComposercomposer=newPduComposer(ctx,sendRequest); finalbyte[]bytesToSend=composer.make(); Threadt=newThread(newRunnable(){ @Override publicvoidrun(){ try{ HttpConnectInterface.sendMMS(ctx,bytesToSend); // }catch(IOExceptione){ e.printStackTrace(); } } }); t.start();
发送pdu到彩信中心的代码:
publicstaticStringmmscUrl="http://mmsc.monternet.com"; //publicstaticStringmmscUrl="http://www.baidu.com/"; publicstaticStringmmsProxy="10.0.0.172"; publicstaticStringmmsProt="80"; privatestaticStringHDR_VALUE_ACCEPT_LANGUAGE=""; //DefinitionfornecessaryHTTPheaders. privatestaticfinalStringHDR_KEY_ACCEPT="Accept"; privatestaticfinalStringHDR_KEY_ACCEPT_LANGUAGE="Accept-Language"; privatestaticfinalStringHDR_VALUE_ACCEPT= "*/*,application/vnd.wap.mms-message,application/vnd.wap.sic"; publicstaticbyte[]sendMMS(Contextcontext,byte[]pdu)throwsIOException{ HDR_VALUE_ACCEPT_LANGUAGE=getHttpAcceptLanguage(); if(mmscUrl==null){ thrownewIllegalArgumentException("URLmustnotbenull."); } HttpClientclient=null; try{ //MakesuretouseaproxywhichsupportsCONNECT. client=HttpConnector.buileClient(context); HttpPostpost=newHttpPost(mmscUrl); //mmsPUDSTART ByteArrayEntityentity=newByteArrayEntity(pdu); entity.setContentType("application/vnd.wap.mms-message"); post.setEntity(entity); post.addHeader(HDR_KEY_ACCEPT,HDR_VALUE_ACCEPT); post.addHeader(HDR_KEY_ACCEPT_LANGUAGE,HDR_VALUE_ACCEPT_LANGUAGE); //mmsPUDEND HttpParamsparams=client.getParams(); HttpProtocolParams.setContentCharset(params,"UTF-8"); HttpResponseresponse=client.execute(post); LogUtility.showLog(tag,"111"); StatusLinestatus=response.getStatusLine(); LogUtility.showLog(tag,"status"+status.getStatusCode()); if(status.getStatusCode()!=200){//HTTP200isnotsuccess. LogUtility.showLog(tag,"!200"); thrownewIOException("HTTPerror:"+status.getReasonPhrase()); } HttpEntityresentity=response.getEntity(); byte[]body=null; if(resentity!=null){ try{ if(resentity.getContentLength()>0){ body=newbyte[(int)resentity.getContentLength()]; DataInputStreamdis=newDataInputStream(resentity.getContent()); try{ dis.readFully(body); }finally{ try{ dis.close(); }catch(IOExceptione){ Log.e(tag,"Errorclosinginputstream:"+e.getMessage()); } } } }finally{ if(entity!=null){ entity.consumeContent(); } } } LogUtility.showLog(tag,"result:"+newString(body)); returnbody; }catch(IllegalStateExceptione){ LogUtility.showLog(tag,"",e); //handleHttpConnectionException(e,mmscUrl); }catch(IllegalArgumentExceptione){ LogUtility.showLog(tag,"",e); //handleHttpConnectionException(e,mmscUrl); }catch(SocketExceptione){ LogUtility.showLog(tag,"",e); //handleHttpConnectionException(e,mmscUrl); }catch(Exceptione){ LogUtility.showLog(tag,"",e); //handleHttpConnectionException(e,mmscUrl); }finally{ if(client!=null){ //client.; } } returnnewbyte[0]; }
至此,彩信的发送算是完成了。
总结:android的彩信相关操作都是没有api的,包括彩信的读取、发送、存储。这些过程都是需要手动去完成的。想要弄懂这些过程,需要仔细阅读android源码中的mms这个app。还有就是去研究mmssms.db数据库,因为彩信的读取和存储其实都是对mmssms.db这个数据库的操作过程。而且因为这个是共享的数据库,所以只能用ContentProvider这个组件去操作db。
总之,想要研究彩信这块(包括普通短信),你就必须的研究mmssms.db的操作方法,多多了解每个表对应的哪个uri,每个uri能提供什么样的操作,那些字段代表短信的那些属性等。
最后推荐个好用的sqlite查看工具:SQLiteDatabaseBrowser。
希望本文所述对大家Android程序设计有所帮助。