欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程之非调用系统界面实现发送彩信的方法(MMS)

程序员文章站 2024-02-13 23:51:22
本文实例讲述了android非调用系统界面实现发送彩信的方法。分享给大家供大家参考,具体如下: 一、问题: 最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能...

本文实例讲述了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程序设计有所帮助。