Android编程之非调用系统界面实现发送彩信的方法(MMS)
本文实例讲述了android非调用系统界面实现发送彩信的方法。分享给大家供大家参考,具体如下:
一、问题:
最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样:
不使用 startactivity,像发短信那样,调用一个类似于发短信的方法
smsmanager smsmanager = smsmanager.getdefault(); smsmanager.sendtextmessage(phonecode, null, text, null, null);
二、解决方法:
由于android上根本就没有提供发送彩信的接口,如果你想发送彩信,对不起,请调用系统彩信app界面,如下:
intent sendintent = new intent(intent.action_send, uri.parse("mms://")); sendintent.settype("image/jpeg"); string url = "file://sdcard//tmpphoto.jpg"; sendintent.putextra(intent.extra_stream, uri.parse(url)); startactivity(intent.createchooser(sendintent, "mms:"));
但是这种方法往往不能满足我们的需求,能不能不调用系统界面,自己实现发送彩信呢?经过几天的努力,终于找到了解决办法。
第一步:先构造出你要发送的彩信内容,即构建一个pdu,需要用到以下几个类,这些类都是从android源码的mms应用中mms.pdu包中copy出来的。你需要将pdu包中的所有类
都拷贝到你的工程中,然后自己酌情调通。
final sendreq sendrequest = new sendreq(); final pdubody pdubody = new pdubody(); final pdupart part = new pdupart(); //存放附件,每个附件是一个part,如果添加多个附件,就想body中add多个part。 pdubody.addpart(partpdu); sendrequest.setbody(pdubody); final pducomposer composer = new pducomposer(ctx, sendrequest); final byte[] bytestosend = composer.make(); //将彩信的内容以及主题等信息转化成byte数组,准备通过http协议 //发送到 ”http://mmsc.monternet.com”;
第二步:发送彩信到彩信中心。
构建pdu的代码:
string subject = "测试彩信"; string recipient = "接收彩信的号码";//138xxxxxxx final sendreq sendrequest = new sendreq(); final encodedstringvalue[] sub = encodedstringvalue.extract(subject); if (sub != null && sub.length > 0) { sendrequest.setsubject(sub[0]); } final encodedstringvalue[] phonenumbers = encodedstringvalue.extract(recipient); if (phonenumbers != null && phonenumbers.length > 0) { sendrequest.addto(phonenumbers[0]); } final pdubody pdubody = new pdubody(); final pdupart part = new pdupart(); part.setname("sample".getbytes()); part.setcontenttype("image/png".getbytes()); string furl = "file://mnt/sdcard//1.jpg"; final pdupart partpdu = new pdupart(); 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); final pducomposer composer = new pducomposer(ctx, sendrequest); final byte[] bytestosend = composer.make(); thread t = new thread(new runnable() { @override public void run() { try { httpconnectinterface.sendmms(ctx, bytestosend); // } catch (ioexception e) { e.printstacktrace(); } } }); t.start();
发送pdu到彩信中心的代码:
public static string mmscurl = "http://mmsc.monternet.com"; // public static string mmscurl = "http://www.baidu.com/"; public static string mmsproxy = "10.0.0.172"; public static string mmsprot = "80"; private static string hdr_value_accept_language = ""; // definition for necessary http headers. private static final string hdr_key_accept = "accept"; private static final string hdr_key_accept_language = "accept-language"; private static final string hdr_value_accept = "*/*, application/vnd.wap.mms-message, application/vnd.wap.sic"; public static byte[] sendmms(context context, byte[] pdu)throws ioexception{ hdr_value_accept_language = gethttpacceptlanguage(); if (mmscurl == null) { throw new illegalargumentexception("url must not be null."); } httpclient client = null; try { // make sure to use a proxy which supports connect. client = httpconnector.buileclient(context); httppost post = new httppost(mmscurl); //mms pud start bytearrayentity entity = new bytearrayentity(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); //mms pud end httpparams params = client.getparams(); httpprotocolparams.setcontentcharset(params, "utf-8"); httpresponse response = client.execute(post); logutility.showlog(tag, "111"); statusline status = response.getstatusline(); logutility.showlog(tag, "status "+status.getstatuscode()); if (status.getstatuscode() != 200) { // http 200 is not success. logutility.showlog(tag, "!200"); throw new ioexception("http error: " + status.getreasonphrase()); } httpentity resentity = response.getentity(); byte[] body = null; if (resentity != null) { try { if (resentity.getcontentlength() > 0) { body = new byte[(int) resentity.getcontentlength()]; datainputstream dis = new datainputstream(resentity.getcontent()); try { dis.readfully(body); } finally { try { dis.close(); } catch (ioexception e) { log.e(tag, "error closing input stream: " + e.getmessage()); } } } } finally { if (entity != null) { entity.consumecontent(); } } } logutility.showlog(tag, "result:"+new string(body)); return body; } catch (illegalstateexception e) { logutility.showlog(tag, "",e); // handlehttpconnectionexception(e, mmscurl); } catch (illegalargumentexception e) { logutility.showlog(tag, "",e); // handlehttpconnectionexception(e, mmscurl); } catch (socketexception e) { logutility.showlog(tag, "",e); // handlehttpconnectionexception(e, mmscurl); } catch (exception e) { logutility.showlog(tag, "",e); //handlehttpconnectionexception(e, mmscurl); } finally { if (client != null) { // client.; } } return new byte[0]; }
至此,彩信的发送算是完成了。
总结:android的彩信相关操作都是没有api的,包括彩信的读取、发送、存储。这些过程都是需要手动去完成的。想要弄懂这些过程,需要仔细阅读android源码中的mms这个app。还有就是去研究mmssms.db数据库,因为彩信的读取和存储其实都是对mmssms.db这个数据库的操作过程。而且因为这个是共享的数据库,所以只能用contentprovider这个组件去操作db。
总之,想要研究彩信这块(包括普通短信),你就必须的研究mmssms.db的操作方法,多多了解每个表对应的哪个uri,每个uri能提供什么样的操作,那些字段代表短信的那些属性等。
最后推荐个好用的sqlite查看工具:sqlite database browser。
希望本文所述对大家android程序设计有所帮助。