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

mms彩信发送 java_Android编程之非调用系统界面实现发送彩信的方法(MMS)相关推荐

  1. android 实现发送彩信方法 (mms),非调用,android 实现发送彩信方法 (MMS),非调用系统界面...

    最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsMan ...

  2. android 实现发送彩信方法 (MMS),非调用系统彩信界面

    最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsMan ...

  3. php 发送短信 sms,php 调用百度sms来发送短信的实现示例

    BaiduSms 百度云 sms php版本 官方没有给出php版本的短信发送sdk, 在此借鉴 [ 点击这里 ],并在此基础上将方法改成 单例模式 在原来的基础上更加容易调用 1.打开 BaiduS ...

  4. 【MFC】MFC中调用系统软键盘的几种方法

    1.直接运行微软系统自带的虚拟键盘程序"osk.exe" 在普通MFC项目中可以调用ShellExecute或者WinExec方法来直接运行微软系统自带的虚拟键盘程序"o ...

  5. 【PyQt】pyqt加载调用ui界面文件的两种方法

    使用PyQt开发界面软件,自然会用到Qt Designer进行界面设计,拖拖按钮.设置菜单什么的,然后保存为 .ui 文件.但是在 Python 代码里面如何使用这些 .ui 文件呢? 有两种方法: ...

  6. ios ipad里面调用系统相册图片不完整解决方法

    项目里面用到了系统相册,在手机里面取出来是完整的,但是在pad里面取出来就是不完整,只是取到左上角的一部分,开始查资料,最后的解决办法是,在调UIImagePickerController这个类时将这 ...

  7. android 实现发送彩信方法 (MMS)

    最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsMan ...

  8. android 实现发送彩信,android 实现发送彩信方法 (MMS)

    最近有个突然有个想法,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager sm ...

  9. Android 调用系统发短信界面,给指定号码发短信,并带短信内容

    工具类如下ContentUtil.java: package com.zhoucj.messagedemo.util; import android.content.Context; import a ...

最新文章

  1. 【bzoj2694】Lcm 莫比乌斯反演+线性筛
  2. .net ticks 转java_《C#并发编程经典实例》—— 转换.NET事件
  3. fedora8完美DNS教程
  4. 共享卫士2.08.03下载
  5. CF600F:Edge coloring of bipartite graph(二分图、构造)
  6. iphone型号表_机器人造iPhone,苹果奋斗八年,还是败给了富士康工人
  7. SSM框架笔记13:Spring MVC基础
  8. 接入Google Play SDK
  9. com.google.common.collect.Range 集合计算
  10. 使用tinymini210开发远程的温度监控系统,实现C#和安卓客户端显示数据和控制
  11. 企业网站建设完成后如何优化推广?
  12. springboot异步调用demo
  13. 7寸显示器 树莓派4b_基于树莓派4B显示屏分类
  14. k8s 拉取镜像失败_k8s 无法拉取阿里云仓库镜像
  15. html是什么意思网络用语,网络用语内涵是什么意思
  16. 第03课:如何快速构建自己的ChatGPT应用?
  17. Java代码生成图片验证码实现
  18. leetcode-种花问题
  19. 学生信息管理系统(数据库设计)
  20. RxJava 3.x 使用总结

热门文章

  1. 识骨寻踪第一季/全集Bones迅雷下载
  2. 秒杀ecshop的前台写shell 0day
  3. (附源码)基于Python的“书怡”在线书店系统的设计与实现 毕业设计082332
  4. 【SSM-报销单】6.报销单-审核报销单,打款
  5. Hi,你想要的在线创建架构图都在这儿!(二)
  6. 云计算技术分享:linux云计算课程学习大纲
  7. 浅析电子元器件-TVS管功效最佳化
  8. MD5及公私钥数据加密工具类
  9. multi-view stereo教程
  10. 2 Keil自带的8051汇编boot源码解析注释