`
triple_zhao
  • 浏览: 7463 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

但是这种方法往往不能满足我们的需求,能不能不调用系统界面,自己实现发送彩信呢?经过几天的努力,终于找到了解决办法。
第一步:先构造出你要发送的彩信内容,即构建一个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。

分享到:
评论
1 楼 niutianbo 2011-10-06  
你好, 我现在在用你的程序 写一个手机发送彩信的程序,其他方面我已经配置好了,但是发现这个函数  client = HttpConnector.buileClient(context);的代码你没有公布出来,所以我无法完成自己的程序,现向您请教,我的QQ398982221,手机18721842286,谢谢!

相关推荐

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

    总结来说,实现非调用系统界面发送彩信的关键在于理解MMS协议和构造PDU的过程。虽然这个过程相对复杂,但通过学习和理解Android MMS应用的源码,开发者可以自行实现这个功能,以满足特定的应用场景需求。

    android 彩信 自定义

    总的来说,自定义Android彩信发送功能涉及到Android的多方面知识,包括权限管理、数据库操作、网络通信以及UI设计。理解并实践这些知识点,不仅可以帮助开发者创建一个功能完备的彩信应用,还能提升他们对Android...

    android 浏览普通彩信列表demo 核心

    通过调用`ContentResolver.query()`方法,我们可以查询`content://mms`或`content://mms/part` Uri,获取彩信的详细信息,包括收件人、发件人、主题、时间戳以及媒体内容等。 在处理媒体内容时,需要注意的是,彩信...

    Android彩信发送介绍

    ### Android彩信发送机制深入解析 在探讨Android平台上的彩信发送流程时,我们主要关注的是用户触发发送操作后,如何将包含图片、数据、文件等多媒体内容的彩信进行封装并最终通过网络发送出去的过程。本文将基于`...

    后台彩信发送

    从提供的文件名来看,`android自定义发彩信实现(不调用系统发彩信界面) - Android移动开发技术文章_手机开发 - 红黑联盟.mht`可能包含一篇详细的文章,解释了如何实现自定义的彩信发送而不调用系统的彩信界面。...

    android 常用的系统调用

    在Android开发中,系统调用是实现应用程序与系统功能交互的重要手段之一。本文将详细介绍部分常见的系统调用方法及其应用场景。 #### 1. 从Google搜索内容 通过调用`Intent.ACTION_WEB_SEARCH`可以启动浏览器进行...

    android通话通讯短信彩信

    发送彩信通常通过`sendMultimediaMessage()`方法,接收彩信则需要监听`android.provider.Telephony.WAP_PUSH_RECEIVED`广播。`Mms`内容提供者用于访问和管理存储的彩信。 **5. Contact_Demo应用实例** `Contact_...

    彩信收发Demo

    开发者可以通过`SmsManager.getDefault()`获取到这个对象,然后调用其`sendMultimediaMessage()`方法来发送彩信。 3. ** Uri 和 ContentResolver **:在Android中,数据通常以Uri的形式存储,ContentResolver则用于...

    简单掌握Android开发中彩信的发送接收及其附件的处理

    在Android开发中,彩信(Multimedia Messaging Service, MMS)是一种用于发送包含多媒体内容的短信的方式,如图片、音频和视频片段。虽然随着即时通讯应用如微信的普及,彩信的使用频率已经大大降低,但理解其发送和...

    MMS发送流程(代码版)android.docx

    本文将详细介绍在Android 2.2版本中MMS(Multimedia Messaging Service)的发送流程,特别是通过代码层面来理解整个过程是如何实现的。MMS是用于发送包含多媒体内容的消息的一种方式,在移动通信领域具有重要的应用...

    Android实现彩信附件的添加与删除功能

    总结,实现Android彩信附件的添加与删除功能涉及到多媒体文件的选择、操作、容量控制、数据持久化等多个方面。通过理解Android的多媒体API和生命周期管理,开发者可以创建功能强大的彩信应用,满足用户发送丰富...

    Android Mms专题之 信息发送流程.doc

    在Android MMS专题中,我们探讨的是信息发送流程,这一过程涉及到多个组件和步骤,确保信息能够成功地从用户界面传递到接收者。以下是对这一过程的详细解析: 首先,当用户在MMS应用程序中创建并发送信息时,信息会...

    android4.0短信源码

    在Android 4.0(Ice Cream Sandwich)系统中,短信服务是通过Mms( Multimedia Messaging Service )组件来实现的。Mms服务不仅处理文本短信,还包括了多媒体信息,如图片、音频和视频等内容的发送与接收。让我们深入...

    android源码目录结构

    + Mms:彩信业务应用程序。 + Music:音乐播放器应用程序。 + PackageInstaller:安装、卸载程序的响应。 + Phone:电话拨号程序。 + Provision:预设应用的状态,使能应用。 + Settings:开机设定,包括电量...

    Android中使用Intent启动信息发送功能的方法介绍.pdf

    总之,Android开发者可以通过Intent来实现与短信相关的各种操作,包括打开短信界面、直接发送短信以及发送包含媒体内容的彩信。这些功能丰富了应用程序的交互性,使得用户可以直接在应用内完成信息交流。了解和熟练...

    android 数据业务流程分析

    - **mms**:专用于多媒体消息服务(MMS),如发送接收彩信。 - **supl**:用于定位服务,提供安全的用户平面定位功能。 - **dun**:支持拨号网络桥接,常用于车载Wi-Fi等场景。 - **hipri**:具有最高优先级,用于...

    DELPHIXE移动开发调用的例子方法.docx

    在Delphi的FireMonkey(FMX)框架下进行Android开发时,可以利用Java Native Interface (JNI) 来调用Android原生API,实现与Android系统的深度集成。 在给定的代码示例中,`Call_URI` 是一个用于调用不同系统功能的...

    原创15个Android很有用的代码片段

    以上代码片段展示了在Android开发中的一些常见操作,包括检查外部存储状态、设置界面样式、获取和操作UI元素以及发送短信和彩信。这些代码片段能够帮助开发者更高效地完成应用功能的实现。在实际开发中,还需注意...

    Android开发中使用mms模块收发单卡和双卡短信的教程

    `SmsMessageSender`实现了`MessageSender`接口,该接口的`sendMessage()`方法负责实际的发送操作,返回值表示发送的类型,对于MMS返回true,对于SMS返回false。 对于单卡和双卡双待手机,短信发送流程有所不同。在...

    深入理解Android Telephony原理剖析与最佳实践

    《深入理解Android Telephony原理剖析与最佳实践》一书,主要针对的是Android系统中的电话服务模块(Telephony)进行深入的解析和实践经验分享,对于想要涉足Android Framework开发的初学者来说,是一本不可多得的...

Global site tag (gtag.js) - Google Analytics