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程序设计有所帮助。