最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样:
不使用 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];
}
更多详细内容请浏览我的博客
http://www.91dota.com/
至此,彩信的发送算是完成了。
总结:android的彩信相关操作都是没有api的,包括彩信的读取、发送、存储。这些过程都是需要手动去完成的。想要弄懂这些过程,需要仔细阅读android源码中的mms这个app。还有就是去研究mmssms.db数据库,因为彩信的读取和存储其实都是对mmssms.db这个数据库的操作过程。而且因为这个是共享的数据库,所以只能用ContentProvider这个组件去操作db。
总之,想要研究彩信这块(包括普通短信),你就必须的研究mmssms.db的操作方法,多多了解每个表对应的哪个uri,每个uri能提供什么样的操作,那些字段代表短信的那些属性等。
最后推荐个好用的sqlite查看工具:SQLite Database Browser。
分享到:
相关推荐
总结来说,实现非调用系统界面发送彩信的关键在于理解MMS协议和构造PDU的过程。虽然这个过程相对复杂,但通过学习和理解Android MMS应用的源码,开发者可以自行实现这个功能,以满足特定的应用场景需求。
总的来说,自定义Android彩信发送功能涉及到Android的多方面知识,包括权限管理、数据库操作、网络通信以及UI设计。理解并实践这些知识点,不仅可以帮助开发者创建一个功能完备的彩信应用,还能提升他们对Android...
通过调用`ContentResolver.query()`方法,我们可以查询`content://mms`或`content://mms/part` Uri,获取彩信的详细信息,包括收件人、发件人、主题、时间戳以及媒体内容等。 在处理媒体内容时,需要注意的是,彩信...
### Android彩信发送机制深入解析 在探讨Android平台上的彩信发送流程时,我们主要关注的是用户触发发送操作后,如何将包含图片、数据、文件等多媒体内容的彩信进行封装并最终通过网络发送出去的过程。本文将基于`...
从提供的文件名来看,`android自定义发彩信实现(不调用系统发彩信界面) - Android移动开发技术文章_手机开发 - 红黑联盟.mht`可能包含一篇详细的文章,解释了如何实现自定义的彩信发送而不调用系统的彩信界面。...
在Android开发中,系统调用是实现应用程序与系统功能交互的重要手段之一。本文将详细介绍部分常见的系统调用方法及其应用场景。 #### 1. 从Google搜索内容 通过调用`Intent.ACTION_WEB_SEARCH`可以启动浏览器进行...
发送彩信通常通过`sendMultimediaMessage()`方法,接收彩信则需要监听`android.provider.Telephony.WAP_PUSH_RECEIVED`广播。`Mms`内容提供者用于访问和管理存储的彩信。 **5. Contact_Demo应用实例** `Contact_...
开发者可以通过`SmsManager.getDefault()`获取到这个对象,然后调用其`sendMultimediaMessage()`方法来发送彩信。 3. ** Uri 和 ContentResolver **:在Android中,数据通常以Uri的形式存储,ContentResolver则用于...
在Android开发中,彩信(Multimedia Messaging Service, MMS)是一种用于发送包含多媒体内容的短信的方式,如图片、音频和视频片段。虽然随着即时通讯应用如微信的普及,彩信的使用频率已经大大降低,但理解其发送和...
本文将详细介绍在Android 2.2版本中MMS(Multimedia Messaging Service)的发送流程,特别是通过代码层面来理解整个过程是如何实现的。MMS是用于发送包含多媒体内容的消息的一种方式,在移动通信领域具有重要的应用...
总结,实现Android彩信附件的添加与删除功能涉及到多媒体文件的选择、操作、容量控制、数据持久化等多个方面。通过理解Android的多媒体API和生命周期管理,开发者可以创建功能强大的彩信应用,满足用户发送丰富...
在Android MMS专题中,我们探讨的是信息发送流程,这一过程涉及到多个组件和步骤,确保信息能够成功地从用户界面传递到接收者。以下是对这一过程的详细解析: 首先,当用户在MMS应用程序中创建并发送信息时,信息会...
在Android 4.0(Ice Cream Sandwich)系统中,短信服务是通过Mms( Multimedia Messaging Service )组件来实现的。Mms服务不仅处理文本短信,还包括了多媒体信息,如图片、音频和视频等内容的发送与接收。让我们深入...
+ Mms:彩信业务应用程序。 + Music:音乐播放器应用程序。 + PackageInstaller:安装、卸载程序的响应。 + Phone:电话拨号程序。 + Provision:预设应用的状态,使能应用。 + Settings:开机设定,包括电量...
总之,Android开发者可以通过Intent来实现与短信相关的各种操作,包括打开短信界面、直接发送短信以及发送包含媒体内容的彩信。这些功能丰富了应用程序的交互性,使得用户可以直接在应用内完成信息交流。了解和熟练...
- **mms**:专用于多媒体消息服务(MMS),如发送接收彩信。 - **supl**:用于定位服务,提供安全的用户平面定位功能。 - **dun**:支持拨号网络桥接,常用于车载Wi-Fi等场景。 - **hipri**:具有最高优先级,用于...
在Delphi的FireMonkey(FMX)框架下进行Android开发时,可以利用Java Native Interface (JNI) 来调用Android原生API,实现与Android系统的深度集成。 在给定的代码示例中,`Call_URI` 是一个用于调用不同系统功能的...
以上代码片段展示了在Android开发中的一些常见操作,包括检查外部存储状态、设置界面样式、获取和操作UI元素以及发送短信和彩信。这些代码片段能够帮助开发者更高效地完成应用功能的实现。在实际开发中,还需注意...
`SmsMessageSender`实现了`MessageSender`接口,该接口的`sendMessage()`方法负责实际的发送操作,返回值表示发送的类型,对于MMS返回true,对于SMS返回false。 对于单卡和双卡双待手机,短信发送流程有所不同。在...
《深入理解Android Telephony原理剖析与最佳实践》一书,主要针对的是Android系统中的电话服务模块(Telephony)进行深入的解析和实践经验分享,对于想要涉足Android Framework开发的初学者来说,是一本不可多得的...