`
triple_zhao
  • 浏览: 7161 次
  • 性别: 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)

    主要介绍了Android编程之非调用系统界面实现发送彩信的方法,涉及Android源码中的mms的使用技巧,需要的朋友可以参考下

    Android开发资料合集-World版!

    4.4.3、titleBar 高级实现方法(更美观) 51 4.4.4、获取标题栏和状态栏高度 57 4.4.5、标题栏显示简单的进度框 57 4.5、MENU 58 4.5.1、简单的代码 58 4.5.2、menu实现的两种方法 58 4.5.3、自定义MENU背景 62 4.5.4...

    Android 开发技巧

    4.4.3、titleBar 高级实现方法(更美观) 51 4.4.4、获取标题栏和状态栏高度 57 4.4.5、标题栏显示简单的进度框 57 4.5、MENU 58 4.5.1、简单的代码 58 4.5.2、menu实现的两种方法 58 4.5.3、自定义MENU背景 62 4.5.4...

    android Intent实例

    12,发彩信 Uri mmsUri = Uri.parse("content://media/external/images/media/23"); returnIt = new Intent(Intent.ACTION_SEND); returnIt.putExtra("sms_body", "shenrenkui"); returnIt.putExtra(Intent.EXTRA_...

    android开发使用例子

    发送彩信 1. Uri uri = Uri.parse("content://media/external/images/media/23"); 2. Intent it = new Intent(Intent.ACTION_SEND); 3. it.putExtra("sms_body", "some text"); 4. it.putExtra(Intent.EXTRA_...

    java开源包1

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener 在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被...

    java开源包3

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包4

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包11

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包2

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包6

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包5

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包10

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包8

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包7

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包9

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

    java开源包101

    apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送。 Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的...

Global site tag (gtag.js) - Google Analytics