最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样:

不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法

SmsManager smsManager = SmsManager.getDefault();

smsManager.sendTextMessage(phoneCode, null, text, null,

null);

可以实现吗?答案是否定的,因为android上根本就没有提供发送彩信的接口,如果你想发送彩信,对不起,请调用系统彩信app界面,如下:

Java代码  

Intent sendIntent =newIntent(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:"));

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包中的所有类

都拷贝到你的工程中,然后自己酌情调通。

Java代码  

finalSendReq sendRequest =newSendReq();

finalPduBody pduBody =newPduBody();

finalPduPart part =newPduPart();//存放附件,每个附件是一个part,如果添加多个附件,就想body中add多个part。

pduBody.addPart(partPdu);

sendRequest.setBody(pduBody);

finalPduComposer composer =newPduComposer(ctx, sendRequest);

finalbyte[] bytesToSend = composer.make();//将彩信的内容以及主题等信息转化成byte数组,准备通过http协议//发送到 ”http://mmsc.monternet.com”;

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的代码:

Java代码  

String subject ="测试彩信";

String recipient ="接收彩信的号码";//138xxxxxxx

finalSendReq sendRequest =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]);

}

finalPduBody pduBody =newPduBody();

finalPduPart part =newPduPart();

part.setName("sample".getBytes());

part.setContentType("image/png".getBytes());

String furl ="file://mnt/sdcard//1.jpg";

finalPduPart partPdu =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);

finalPduComposer composer =newPduComposer(ctx, sendRequest);

finalbyte[] bytesToSend = composer.make();

Thread t =newThread(newRunnable() {

@Override

publicvoidrun() {

try{

HttpConnectInterface.sendMMS(ctx, bytesToSend);

//

}catch(IOException e) {

e.printStackTrace();

}

}

});

t.start();

发送pdu到彩信中心的代码:

publicstaticString mmscUrl ="http://mmsc.monternet.com";

// public static String mmscUrl = "http://www.baidu.com/";

publicstaticString mmsProxy ="10.0.0.172";

publicstaticString mmsProt ="80";

privatestaticString HDR_VALUE_ACCEPT_LANGUAGE ="";

// Definition for necessary HTTP headers.

privatestaticfinalString HDR_KEY_ACCEPT ="Accept";

privatestaticfinalString HDR_KEY_ACCEPT_LANGUAGE ="Accept-Language";

privatestaticfinalString HDR_VALUE_ACCEPT =

"*/*, application/vnd.wap.mms-message, application/vnd.wap.sic";

publicstaticbyte[] sendMMS(Context context,byte[] pdu)throwsIOException{

HDR_VALUE_ACCEPT_LANGUAGE = getHttpAcceptLanguage();

if(mmscUrl ==null) {

thrownewIllegalArgumentException("URL must not be null.");

}

HttpClient client =null;

try{

// Make sure to use a proxy which supports CONNECT.

client = HttpConnector.buileClient(context);

HttpPost post =newHttpPost(mmscUrl);

//mms PUD START

ByteArrayEntity entity =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);

//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");

thrownewIOException("HTTP error: "+ status.getReasonPhrase());

}

HttpEntity resentity = response.getEntity();

byte[] body =null;

if(resentity !=null) {

try{

if(resentity.getContentLength() >0) {

body =newbyte[(int) resentity.getContentLength()];

DataInputStream dis =newDataInputStream(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:"+newString(body));

returnbody;

}catch(IllegalStateException e) {

LogUtility.showLog(tag,"",e);

// handleHttpConnectionException(e, mmscUrl);

}catch(IllegalArgumentExceptione) {

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.;

}

}

returnnewbyte[0];

}

更多详细内容请浏览我的博客http://www.91dota.com/

至此,彩信的发送算是完成了。

总结:android的彩信相关操作都是没有api的,包括彩信的读取、发送、存储。这些过程都是需要手动去完成的。想要弄懂这些过程,需要仔细阅读android源码中的mms这个app。还有就是去研究mmssms.db数据库,因为彩信的读取和存储其实都是对mmssms.db这个数据库的操作过程。而且因为这个是共享的数据库,所以只能用ContentProvider这个组件去操作db。

总之,想要研究彩信这块(包括普通短信),你就必须的研究mmssms.db的操作方法,多多了解每个表对应的哪个uri,每个uri能提供什么样的操作,那些字段代表短信的那些属性等。

最后推荐个好用的sqlite查看工具:SQLite Database Browser。

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

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

    本文实例讲述了Android非调用系统界面实现发送彩信的方法.分享给大家供大家参考,具体如下: 一.问题: 最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使 ...

  2. android 引用非 android 工程,Unity3D调用android方法(非插件方式)

    关于Unity3D工程与android工程的转换与合并,请参考我的另外一篇博客,如果你对Unity3D工程加入到android工程的过程不熟悉,也请先看完下面这篇博客: android与Unity3D ...

  3. Unity3D调用android方法(非插件方式)

    关于Unity3Dproject与androidproject的转换与合并,请參考我的另外一篇博客.假设你对Unity3Dproject增加到androidproject的过程不熟悉.也请先看完以下这 ...

  4. unity无法调用android,Unity3D调用android方法(非插件方式)

    关于Unity3D工程与android工程的转换与合并,请参考我的另外一篇博客,如果你对Unity3D工程加入到android工程的过程不熟悉,也请先看完下面这篇博客: 下面,我们来说说本博客的终端, ...

  5. Android 短信模块分析(四) MMS之短信的发送与接收

     MMS之短信的发送与接收分析: 一.信息发送: com.android.mms.data.WorkingMessage.java 类 send()函数: public void send() { . ...

  6. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

  7. 一种绕过Android P对非SDK接口限制的简单方法

    众所周知,Android P 引入了针对非 SDK 接口(俗称为隐藏API)的使用限制.这是继 Android N上针对 NDK 中私有库的链接限制之后的又一次重大调整.从今以后,不论是native层 ...

  8. Android方法调用实体类的值,React Native调用Android原生方法和传值

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 创建react native 项目:react-native init callAndroidProject cd ca ...

  9. linux非阻塞的socket发送数据出现EAGAIN错误的处理方法

    一.非阻塞socket 非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回.比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上.在 ...

最新文章

  1. hibernate异常之--count查询异常
  2. Net Core下多种ORM框架特性及性能对比
  3. redis:Invalid input of type: 'bool' type. Convert to a byte,string or number first
  4. 如何使用Cisdem Video Converter在Mac上将大型 AVI 转换为 MP4
  5. Spring源码追踪3——AOP机制
  6. git 空提交和重置提交者(转载)
  7. 网络/命令行抓包工具tcpdump详解
  8. KISS保持简单:纪念丹尼斯·里奇
  9. Android hook微信 apk 实时获取微信聊天消息记录
  10. linux下磁盘坏道修复,linux磁盘坏道修复记录
  11. js插件---弹出层sweetalert2
  12. 搭建自已的turn服务器
  13. Codeforces div1+2
  14. CPU信息查询与CPU测试方法总结
  15. 释放/清理 VMware 虚拟磁盘空间
  16. JEECG容器化部署:Alpine镜像方式
  17. oracle 删除awr报告,学习笔记:Oracle awr入门 深入了解AWR报告
  18. 深度学习中的两种不确定性:偶然不确定性和认知不确定性(Aleatoric Uncertainty Epistemic Uncertainty)
  19. 欧拉路径和欧拉回路(Euler Path and Euler Circuit)解释
  20. 亚马逊CPC广告每日该怎么调整?

热门文章

  1. 一个老中医刚刚公布的额(太强大了 除了教你怎么保健连怎么知生儿生女都有。。。。。。。。。。。。。。。。。。。。。。)
  2. http://www.cnblogs.com/zyw-205520/p/3762954.html
  3. 电脑总是弹出乱七八糟的内容怎么办
  4. 互动媒体——自画像+简单音乐可视化
  5. 泉州数字平台让城市管理更“智慧” 数分钟“搞掂”
  6. bnuoj 44359 快来买肉松饼
  7. 基于JAVA信贷管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
  8. C++题解:幼儿园买玩具
  9. win10 操作中心是灰色无法选择 终极解决方法
  10. 独立站运营技巧:如何引流?如何提高转化率