android 实现发送彩信方法 (MMS),非调用系统彩信界面
最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样:
不使用 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:"));
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";
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的代码:
view plaincopy to clipboardprint?
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 实现发送彩信方法 (MMS),非调用系统彩信界面相关推荐
- android 实现发送彩信方法 (mms),非调用,android 实现发送彩信方法 (MMS),非调用系统界面...
最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsMan ...
- mms彩信发送 java_Android编程之非调用系统界面实现发送彩信的方法(MMS)
本文实例讲述了Android非调用系统界面实现发送彩信的方法.分享给大家供大家参考,具体如下: 一.问题: 最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使 ...
- android 实现发送彩信方法 (MMS)
最近有个需求,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager smsMan ...
- android 实现发送彩信,android 实现发送彩信方法 (MMS)
最近有个突然有个想法,不去调用系统界面发送彩信功能.做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法 SmsManager sm ...
- android 根据时间获取周几_android 调用系统 calendars 如何获取一个指定日期的所有日程 event。...
android 调用系统 (CalendarContract)calendars 如何获取一个指定日期的所有日程(包含周期事件) ? 难点在于,很多event存的时候是有rrule的,也就是周期. 以 ...
- Android 通讯录学习笔记之——目标:调用系统通讯录的编辑功能
资料来源:http://www.eoeandroid.com/thread-37271-1-1.html 代码功能:调用系统自带的编辑联系人功能 代码片段 // 如下用法在ANADOIR 2.3.6上 ...
- android 非root抓包,未root的Android手机抓包方法(非tcpdump)
但是有个限制,就是抓包的机器必须获取了root权限. 所以,遇到未root的手机,tcpdump就无能为力了. 那如何抓未root的手机的包呢? 方法就是:手机连路由,抓路由的包,过滤出手机的包(好吧 ...
- android开发那些事儿(四)--调用系统相机像素过低
如题,这个需求本不是一个很复杂的过程,但是却存在一些隐患,我也是最近在项目中碰到这个问题,将Android通过相机或相册获取图片并最终显示在界面上做了一个小研究,现将一些结果和附上的一个Demo叙述如 ...
- Android编程获取网络连接状态及调用网络配置界面
获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...
最新文章
- Debevec方法计算相机响应函数CRF
- 0x63.图论 - 树的直径与最近公共祖先
- 存储过程——数据的分页
- 【前端基础进阶】JS-Object 功能详解
- WebLogic调用WebService提示Failed to localize、Failed to create WsdlDefinitionFeature
- Python数据分析:pandas中Dataframe的groupby与索引
- Yacc 与 Lex
- linux 调节风扇速度命令,ubuntu系统调节GPU风扇转速
- 怎么在我们的App中集成条码扫描功能?
- 第7章 集成方法、随机森林
- java及vue实现获取电脑打印机及打印功能
- Office 365 Certification 考试心得
- python中matrix是什么意思_Python与线性代数——Numpy中的matrix()和array()的区别
- crash工具使用方法
- 自制 | 纯手工自制一个16位RISC架构CPU
- 自己经常用的一些电影下载网址
- Gause算法c语言实现,Gause是什么意思
- 用javascript生成屏幕尺
- Windows7主题包
- Kubernetes集群更换证书(正常更新方法、和更新证书为99年)
热门文章
- 一个老中医刚刚公布的额(太强大了 除了教你怎么保健连怎么知生儿生女都有。。。。。。。。。。。。。。。。。。。。。。)
- 南方科技大学计算机系优秀毕业生,南科大2020届本科十佳毕业生评选结果揭晓...
- 流浪大师善始者众善终者寡_流浪者–适合每个开发人员的瑞士军刀
- 从C程序到bin文件
- 【Caffe笔记】二.Forward and Backward(前传/反传)
- 猛犸创始人季逸超:互联网新人类
- HTML+CSS+JS实现简单登录模板
- 剑指offer——树的子结构
- java mail 554_javaMail 163 邮箱发 qq 邮箱 总是报 554 DT:SPM 163 smtp11
- R语言作图——Pie chart(饼图)